zwracanie przez funkcje tablicy dwuwymiarowej
Ostatnio zmodyfikowano 2020-08-09 17:47
lewus Temat założony przez niniejszego użytkownika |
zwracanie przez funkcje tablicy dwuwymiarowej » 2020-08-08 14:14:38 Witam Potrzebuje wysłać do funkcji tablice 2-wymiarową, następnie zwrócić ją do funkcji main. Program działa na tablicy 1-wymiarowej, ale po dodaniu drugiego wymiaru pojawia się błąd: C2664 „int **fun(int *[])”: nie można dokonać konwersji argumentu 1 z „int [2][2]” do „int *[]”. Problem pojawia się w miejscu wywolania funkcji fun. #include <iostream>
using namespace std;
int ** fun( int ** t )
{ t[ 0 ][ 0 ] += 1; t[ 1 ][ 0 ] += 2; return t; }
int main() { int tab[ 2 ][ 2 ] = { { 11, 12 }, { 13, 14 }, }; fun( tab ); cout << tab[ 0 ][ 0 ] << " " << tab[ 1 ][ 0 ]; return 0; } |
|
pekfos |
» 2020-08-09 09:28:43 int tablica[ 100 ][ 2 ]; int( * wskaznik )[ 2 ] = tablica; Nie zapomnij o nawiasie, zmienia tu całkowicie typ wskaźnika. Wskaźnik na tablicę wielowymiarową ma zakodowane w swoim typie rozmiary drugiego i następnych wymiarów, więc coś takiego zadziała tylko dla tablic int[N][2]. |
|
lewus Temat założony przez niniejszego użytkownika |
» 2020-08-09 13:58:51 Dzięki za wskazówke. Czy mógłbyś napisać jak powinien teraz wyglądać naglówek funkcji? Czy coś trzeba zmienić w wywołaniu funkcji albo w jej ciele? |
|
pekfos |
» 2020-08-09 15:49:25 Trzeba zmienić typy argumentu i wartości zwracanej. Argument jest prosty, taki wskaźnik dokładnie jak podałem. Co do wartości zwracanej przez ten nawias składnia może wyglądać dziwnie: int( * funkcja( int( * tab )[ 2 ] ) )[ 2 ] { return tab; } W tej sytuacji lepiej może zdefiniować alias na typ wskaźnika typedef int( * wskTabNx2 )[ 2 ];
wskTabNx2 funkcja( wskTabNx2 tab ) { return tab; } Tak na marginesie, nie zwracasz tu tablicy, tylko wskaźnik który dostałeś przez argument, wiec w zasadzie zwracanie tu czegokolwiek jest zbędne. |
|
lewus Temat założony przez niniejszego użytkownika |
» 2020-08-09 16:09:09 Dzięki, działa. A co oznacza ta ostatnia [2]? Pierwszy wymiar tablicy? |
|
pekfos |
» 2020-08-09 17:07:53 Drugi wymiar tablicy. Wspominałem o tym w pierwszym poście. Wskaźnik na tablicę N-wymiarową, wskazuje na tablicę (N-1)-wymiarową, w tym sensie że (N-1)-wymiarowa tablica jest wskazywanym elementem: #include <iostream>
int main() { int( * p )[ 100 ]; std::cout << sizeof * p << '\n'; } 400
Wskaźnik wskazuje na jeden element, ale równie dobrze może to być sekwencja takich elementów. Wynikiem wskaznik[i] jest odniesienie do jakiejś (N-1)-wymiarowej tablicy w pamięci i można pisać po tym dalsze [] żeby ją indeksować, ale żeby w ogóle dało się napisać wskaznik[i] musi być znany rozmiar wskazywanego elementu (więc wymiary 2..N). Z tego samego powodu tworząc nową tablicę wielowymiarową można pominąć pierwszy wymiar, a kompilator wydedukuje jego wartość na podstawie danych podanych do inicjalizacji. int a[][ 2 ] = { 1, 2, 3, 4 }; |
|
lewus Temat założony przez niniejszego użytkownika |
» 2020-08-09 17:47:49 Dzięki za pomoc. Pisze pokera i teraz elegancko sortuje karty funkcją. Bez tablic i wskaźników ani rusz. |
|
« 1 » |