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. 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 ] ); } |
|
pekfos |
» 2014-11-14 16:20:51 Nie da się takiej tablicy tak zwrócić. |
|
Tomek_z_W11 |
» 2014-11-14 16:36:21 Nie mógłbyś tej tablicy zamienić na char **tab? Wtedy dałoby radę... |
|
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? |
|
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ć: char ** func() { static char * ret[ 200 ]; static char * tab[ 5 ] = {...}; static char * ta[ 5 ] = {...}; return ret; }
|
|
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; } |
|
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. |
|
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. char ** cutstr( char str[], int * size, int cutmaxlegnth ) { int i; char * ret[ K ]; 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; } 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 ]; ++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 ] ); 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]. |
|
« 1 » 2 |