Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

char *tab[200] jak to zwrócić ??

Ostatnio zmodyfikowano 2014-11-16 15:57
Autor Wiadomość
Hexbinary
Temat założony przez niniejszego użytkownika
char *tab[200] jak to zwrócić ??
» 2014-11-14 16:14:59
Sprawa jest prosta. Nie wiem jak zwrócić char *tab[200]. Zależy mi na stylu C.
C/C++
char ??* func() {
    char * ret[ 200 ];
    char tab[ 5 ] = { 'l', 's' };
    char ta[ 5 ] = { ' ', '-', 'a' };
    ret[ 0 ] = tab;
    ret[ 1 ] = ta;
    printf( "%s", ret[ 0 ] );
    printf( "%s", ret[ 1 ] );
    return ??? ret;
}
void main() {
    char * tab[ 200 ];
    ??? tab = func();
    printf( "%s\n", tab[ 0 ] );
    printf( "%s\n", tab[ 1 ] );
}
P-120575
pekfos
» 2014-11-14 16:20:51
Nie da się takiej tablicy tak zwrócić.
P-120576
Tomek_z_W11
» 2014-11-14 16:36:21
Nie mógłbyś tej tablicy zamienić na char **tab? Wtedy dałoby radę...
P-120581
Hexbinary
Temat założony przez niniejszego użytkownika
» 2014-11-14 16:49:53
Da się to jakoś innaczej zrobić nie wiem przez coś w stylu referencji chodzi o to by w main było widać tą tablice?
P-120584
Kaikso
» 2014-11-14 17:06:58
O ile dobrze pamiętam podobnie działa funkcja
char * strerror( int errnum )
, posiada ona bufor statyczny w postaci
static char __buffer[ 1024 ]
.
W twoim przypadku wystarczy dodać
static
 przed `ret', `tab' i `ta', a typ zwracany to
char **
.
Całość powinno tak wyglądać:
C/C++
char ** func()
{
    static char * ret[ 200 ];
    static char * tab[ 5 ] = {...};
    static char * ta[ 5 ] = {...};
    //...
    return ret;
}
P-120586
Tomek_z_W11
» 2014-11-14 17:14:58
Statyczną tablice wskaźników zamienić na dynamiczną tablicę wskaźników, tak jak napisałem

char **tab;

Twoja funkcja wyglądałaby tak:



#include <iostream>
#include <stdlib.h>

using namespace std;


char ** func() {
    int i; //do petli

    char ** ret = (char**)malloc(sizeof(char *) * 200); //alokacja wierszy (200 wierszy)
    for(i=0; i<200; i++) //dla kazdego wiersza alokujemy ileś tam kolumn
        ret[ i ]=(char*)malloc(sizeof(char) * 50); //alokacja kolumn, czyli ile liter ma mieć każdy wiersz

    char tab[ 5 ]={'l', 's'};
    char tab2 [ 5 ] = { ' ', '-', 'a' };

    ret[ 0 ] = tab;
    ret[ 1 ] = tab2;

    //printf( "%s", ret[ 0 ] );
    //printf( "%s", ret[ 1 ] );
    return ret;
}
int main() { //main musi być int
    char ** tab = func();

    printf( "%s\n", tab[ 0 ] );
    printf( "%s\n", tab[ 1 ] );

    return 0;
}
P-120589
Kaikso
» 2014-11-14 17:24:32
Taka postać jest niepraktyczna po każdym użyciu funkcji należało by wykonać funkcje free().
Już lepiej użyć wskaźnika na tablice w parametrach.

@Tomek_z_W11
To nie zadziała tablice tab i tab2 są na stosie, a po wyjsciu z funkcji wartość jest nie określona. Nadodatek nadpisujesz zaalokowane elementy co uniemoż dealokacje tych elementów.

@edit
Dynamicznych elementów lepiej nie używać jeśli nie ma takiej potrzeby.
P-120592
Hexbinary
Temat założony przez niniejszego użytkownika
» 2014-11-14 17:59:35
Dobra ale to mi i tak nie pomoże ,bo troche skłamałem w kodzie.
tak wygląda prawdziwa funkcja.
C/C++
char ** cutstr( char str[], int * size, int cutmaxlegnth ) {
    int i;
    char * ret[ K ];
    //char tab[5]={'l','s'};
    //char ta[5]={' ','-','a'};
    //ret[0]=tab;
    //ret[1]=ta;
    //printf("%s",ret[0]);
    //printf("%s",ret[1]);
    char * cut =( char * ) malloc( sizeof( char ) * cutmaxlegnth );
    char * cut_p = cut;
    char * tmp;
    char * tmp_p;
    int j = 0;
    int lret = 0;
    for( i = 0; i < strlen( str ); ++i ) {
        if( i == 0 ) {
            tmp = cut;
            tmp_p = tmp;
        }
        // tmp=str[i];
        //      ++tmp;
        if( str[ i ] == ' ' ) {
            ret[ j ] = tmp_p;
            char * ncut =( char * ) malloc( sizeof( char ) * cutmaxlegnth );
            tmp = ncut;
            tmp_p = tmp;
            ++j;
            ++lret;
            continue;
        } * tmp = str[ i ];
        //printf("tmp %c\n",*tmp);
        ++tmp;
    }
    ret[ j ] = tmp_p; ++j;
    ret[ j ] = NULL;
    printf( "lret: %d\n", lret );
    * size = lret + 2;
    for( i = 0; i < lret + 1; ++i )
         printf( "%s\n", ret[ i ] ); ///pocięte
   
    return ret;
}
A static nie moge dać do dynamicznej tego typu. Chyba zostaje tylko zapis do pliku.
Funkcja tnie stringa z normalnymi znakami na char *tab[200].
P-120595
« 1 » 2
  Strona 1 z 2 Następna strona