latajacaryba Temat założony przez niniejszego użytkownika |
Wskaźniki do tablicy dwuwymiarowej - posługiwanie się nimi » 2016-12-04 13:28:26 Witam. Mam funkcję, w której muszę użyć tablicy dwuwymiarowej(jednej z wielu), dlatego chciałbym użyć do tego wskaźnika. Widziałem wiele tematów, ale mało co wnosiły. Dlatego mam nadzieję, że tu uda mi się dowiedzieć jak to w końcu jest. Mam więc tablice dwuwymiarową. Potrzebuje wskaźnika, i chcę aby był on argumentem. Z góry dzięki. |
|
karambaHZP |
» 2016-12-04 14:29:32 Pokaż co masz. ** . Dlaczego nie możesz skorzystać z zapisu tablicowego? |
|
Gibas11 |
» 2016-12-04 14:41:57 Nie lepiej jakiś kontener z STL? std::array < std::array < int, 5 >, 5 > tablica5x5; jeśli masz stały rozmiar albo std::vector < std::vector < int >> tablica2d; jeśli ma być dynamicznie alokowana. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-04 14:42:28 wybor[ 10 ][ 10 ]; wybor2[ 10 ][ 10 ]; wybor3[ 10 ][ 10 ]; int main() { ( * wsk )[ 10 ][ 10 ]; losuj( wsk, wybor1, wybor2, wybor3 ); }
void losuj( char( * wsk )[ 10 ][ 10 ], char wybor1[ 10 ][ 10 ], char wybor2[ 10 ][ 10 ], char wybor3[ 10 ][ 10 ] ) { int los =( rand() % 3 ) + 0; switch( los ) { case 0: wsk = & wybor1; break; case 1: wsk = & wybor2; break; case 2: wsk = & wybor3; break; } }
W ten sposób chciałbym to zrobić. Nawet nie próbuj kompilować kodu, bo wywala następujący błąd dla wszystkich case'ów w funkcji: cannot convert 'char (**)[10]' to 'char (*)[10][10]' in assignment Dziwne jest to, ze w main mam dokładnie taką instrukcję jak w funkcji ( char( * wsk )[ 10 ][ 10 ] = & wybor1; ) i działa |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-04 14:43:40 @Gibas11 Wolałbym bez, jeszcze ich nie znam, a tą funkcję będę potem używał/modyfikował na wiele sposobów :/ |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-05 10:41:20 To musi być wskaźnik niestały, czyli przesyłanie nazwy tablicy odpada. |
|
Monika90 |
» 2016-12-05 14:45:34 Po pierwsze, musisz zrozumieć że wskaźnik do tablicy, a wskaźnik do elementu tej tablicy to nie jest to samo. Po drugie, tablica dwuwymiarowa to tak naprawdę tablica tablic. To znaczy tablica której elementy to też są tablice. Po trzecie, nazwa tablicy jest nazwą tablicy i niczym innym. Nie jest, nigdy nie była i nigdy nie będzie wskaźnikiem do pierwszego elementu tablicy. Ale wartość typu tablicowego będzie w pewnych sytuacjach automatycznie konwertowana na wskaźnik do pierwszego elementu tej tablicy. Mamy więc kilka opcji: 1. Tradycyjnie przekazujemy wskaźnik do pierwszego elementu tablicy i jej rozmiar void f( int( * p )[ 10 ], int size ) { std::cout << "t[0][0] == " << p[ 0 ][ 0 ] << std::endl; }
int main() { int t[ 10 ][ 10 ] = { }; f( t, 10 ); }
2. Można też tak jak chciałeś, wskaźnik do całej tablicy. Rozmiaru nie przekazujemy, bo zawsze musi być 10 na 10. Tutaj trzeba dokonać dereferencji wskaźnika, zanim będzie się indeksować. void f( int( * p )[ 10 ][ 10 ] ) { std::cout << "t[0][0] == " <<( * p )[ 0 ][ 0 ] << std::endl; }
int main() { int t[ 10 ][ 10 ] = { }; f( & t ); }
3. Można to uprościć przekazując tablicę przez referencję void f( int( & p )[ 10 ][ 10 ] ) { std::cout << "t[0][0] == " << p[ 0 ][ 0 ] << std::endl; }
int main() { int t[ 10 ][ 10 ] = { }; f( t ); }
|
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2016-12-06 12:50:45 No dobrze, ale czym właściwie jest wskaźnik do tablicy. Ja uczyłem się, że wskaźnik do tablicy to po prostu wskaźnik na któryś z jej elementów. Czym to się różni? Poza tym po co przekazujemy tablice przez referencję, skoro i tak zawsze pracujemy na oryginale, a nie kopii? I ostatnie (tu pytam z czystej ciekawości) dlaczego J. Grębosz dobitnie stwierdzał, że: "nazwa tablicy to wskaźnik do jej pierwszego elementu" skoro tak nie jest? Chciał to łatwiej wytłumaczyć, bez zagłębiania się w szczegóły? |
|
« 1 » 2 |