Prototyp funkcji zwracającej (wsk-na-)tablicę

0

Tworzę funkcję zwracającą tablicę:

int table[3]

int fun(int);
void proc(int);

int (*fun(int o[3]))[3]{
	int (*pointer_table)[3];
	pointer_table = &table;
	
	return pointer_table;
}

void proc(int x)
{    
     fun(table);    
}

Powyższy prototyp funkcji fun przechodzi kompilację.

int table[3]

int fun(int);
void proc(int);

void proc(int x)
{    
     fun(table);    
}

int (*fun(int o[3]))[3]{
	int (*pointer_table)[3];
	pointer_table = &table;
	
	return pointer_table;
}

Gdyby jednak zadeklarować proc przed fun to uzna to za błąd - "invalid conversion from int*' to int' ".
Próbuję w takim razie przerobić prototyp fun na int (nnn(int))[3] i znowu się kompiluje - w obu powyższych przypadkach (choć nie wiem dlaczego musi być int*, a nie int). Teraz jednak zmieniam argument dla fun z o[3] na o[3][1] i znowu powstaje błąd. W innym przypadku, gdy próbuję dodać argument i funkcja wygląda tak int (*fun(int o[3], int e[3]))[3] nie potrafię zbudować dla niej prototypu. Poniższy nie działa :

int (*nnn(int*, int*))[3];

Wypisuje, że "too few arguments to function `int (* nnn(int*, int*))[3]' "

Dlaczego więc o[3][1] nie przechodzi i jak skonstruować prototyp dla wieloargumentowej funkcji (argumenty mogą być różne - np. (int a, int b[1], int c[2][3]) ) zwracającej tablicę ?

0

Zdajesz sobie sprawę, że zwracasz tablicę wskaźników? Oto Ci chodzi?

Samą tablicę zwraca się po prostu przez wskaźnik, tak samo można ją przez wskaźnik odebrać.
Po drugie zwracasz wskaźnik na tablicę lokalną, która po wyjściu z funkcji będzie zniszczona.

0
tobix10 napisał(a)

Zdajesz sobie sprawę, że zwracasz tablicę wskaźników?
Nikt sobie nie zdaje z tego sprawy, bo zwracany jest tu wskaźnik na tablicę.

0

Zamierzam zwrócić tablicę - a, że chyba nie można bezpośrednio zwracać tablicy, to zwracam wskaźnik na nią(a sama tablica może być w wyniku działania funkcji zmieniona). Po wywołaniu funkcji mogę sobie po prostu przypisać wynik do innej tablicy. Jeśli coś robię nie tak, to niech mnie ktoś oświeci. A jeśli jest ok, to głównym problemem jest stworzenie tego prototypu.

0

tak. w C++ nie dozwolone jest zwracanie tablic z funkcji. mozna zwracac m.in. wskazniki na tablice, struktury zawierajace tablice, wskazniki funkcji ktore zwroca wskaznik na tablice, ale tablic sensu stricte zwrocic nie mozesz.

funkcje masz dobrze zdefiniowana, ale forward decl sobie skopales. jakie znowu fun:int->int ? przeciez fun jest int[3]->int(*)[3]

int table[3];

int (*fun(int [3]))[3]; // a nie int fun(int) !

void proc()
{
    // a druga rzecz to taka, ze skoro zwracasz PTR-na-TAB, to zwracasz 'tak jakby int**',
    // wiec tutaj potrzebujesz * przed proba wykonania []
    int tmp = (*fun(table)) [2];
}

int (*fun(int o[3]))[3]
{
    return &table;
}

btw. pointer_table znaczy cos innego niz pointer_to_table, wiec uwazaj na angielski:)

0

Ok, dzięki. Rzeczywiście int (*fun(int [3]))[3] nie int (*fun(int *))[3] - teraz działa za każdym razem - jakakolwiek będzie kolejność funkcji :). Ale podobne podejście się nie sprawdza w przypadku funkcji wieloargumentowej, np. dla:

int (*fun(int o[3], int e[3]))[3]

(*fun(int [3], int[3]))[3] nie zadziała. Jak w takim przypadku powinien w takim razie wyglądać prototyp (o ile ta nazwa jest prawidłowa) ?

0

Poczytałem trochę Symfonii na temat wskaźników, znalazłem parę ciekawych informacji, ale nigdzie nie znalazłem czegoś, co pomogłoby mi rozwiązać ten konkretny problem. Ktoś może napisać jakąś wskazówkę ? Albo najlepiej to co mógłbym od razu wykorzystać ? Bo przecież nie jest to kilkaset lini kodu, ale jedna.

0

serwer mi padl i nie mam dostepu do swojego poligonu, ale ponizsze powinno byc poprawne:

int table[3];
int table2[9];

int (*fun(int [3], int[9]))[3]; // (forward) declaration

void proc()
{
    int tmp = (*fun(table, table2)) [2];  // invocation
}

int (*fun(int o[3], int p[9]))[3] // definition
{
    return &table;
}
0

To dziwne. A jakiego środowiska używasz ? Bo mi taka deklaracje nie przechodzi .... właśnie przeszła X_x .... mase czasu próbowałem to rozwikłać. Błąd kompilatora wprowadził w błąd mnie ... miałem wywołanie funkcji jednoargumentowej - mimo, że definicja i deklaracja były już 2argumentowe to wywołania nie zmieniłem, bo podświetlało błąd w deklaracji pisząc, że jest za mało argumentów, czego nie potrafiłem pojąć. Ehh.. . Dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1