Tablica wielowymiarowa jako parametr funkcji
Ostatnio zmodyfikowano 2016-05-12 06:37
hunter44 Temat założony przez niniejszego użytkownika |
Tablica wielowymiarowa jako parametr funkcji » 2016-05-11 21:44:14 Witam. Chodzi o czysty C. Program ma z pliku wczytywać liczby do macierzy. Oczywiscie zrobilem malloca wczesniej. Napisałem taką funkcję(zamieszczam tylko jej fragment, bo nie ma znaczenia to co jest dalej): wpisz_do_tablicy( int ** nazwa_tablicy, const char * nazwa_pliku ) { macierz_a = fopen( nazwa_pliku, "r" ); while( feof( macierz_a ) == 0 ) { x = fgetc( macierz_a ); if(( x >= '0' ) &&( x <= '9' ) ) { int liczba = atoi( & x ); my_number = my_number * 10 + liczba; nazwa_tablicy[ i ][ j ] = my_number; } fclose( macierz_a ); }
Funkcję wywołuje w main w taki sposób: int main() { char * macierz_a = "macierz_a.txt"; int ** tab1; wpisz_do_tablicy( tab1, macierz_a ); }
Problem mam z pierwszym parametrem. Ma on być nazwą tablicy do której będą wpisywane cyfry. Czyli w mojej funkcji tam gdzie jest "nazwa_tablicy" program ma to zamienić na "tab1". Nie chce mi to zadziałać. Co robię źle ? Próbowałem przed "tab1" dopisywać *, ** albo &. Nie przyniosło to rezultatu. Czy może ktoś napisać jak to powinno wyglądać ? Nie mam już pomysłu jak to rozwiązać a na pewno rozwiązanie okaże się proste. Visual wywala dokładnie taki błąd: Exception thrown: read access violation.
nazwa_tablicy was 0xCDDDCDDE.
If there is a handler for this exception, the program may be safely continued.
Zamieszczę ewentualnie malloca: alokuj_pamiec( int ** nazwa_tablicy, int kolumny, int wiersze ) { nazwa_tablicy =( int ** ) malloc( wiersze * kolumny * sizeof( int ) ); for( int i = 0; i <( kolumny ); i++ ) { nazwa_tablicy[ i ] =( int * ) malloc( kolumny * sizeof( int ) ); } for( int j = 0; j <( wiersze ); j++ ) { nazwa_tablicy[ j ] =( int * ) malloc( wiersze * sizeof( int ) ); printf( "%d", j ); }
i w taki sposób go wywołuje: int main() { int tab1_k = 0; int tab1_w = 0; otworz_i_zlicz( macierz_a, & tab1_k, & tab1_w ); alokuj_pamiec( & tab1, tab1_k, tab1_w ); }
|
|
mateczek |
» 2016-05-12 06:37:37 błąd który się od razu rzuca w oczy to sposób alokacji tablicy alokuj_pamiec( int ** nazwa_tablicy, int kolumny, int wiersze ) { nazwa_tablicy =( int ** ) malloc( wiersze * kolumny * sizeof( int ) ); for( int i = 0; i <( kolumny ); i++ ) { nazwa_tablicy[ i ] =( int * ) malloc( kolumny * sizeof( int ) ); } for( int j = 0; j <( wiersze ); j++ ) { nazwa_tablicy[ j ] =( int * ) malloc( wiersze * sizeof( int ) ); printf( "%d", j ); }
w c++ mógłbyś to obeść referencją alokuj_pamiec( int ** & nazwa_tablicy, int kolumny, int wiersze ) { }
w C musisz albo przekazać wskaźnik na wskaźnik!! alokuj_pamiec( int *** nazwa_tablicy, int kolumny, int wiersze ) { }
albo prościej: int ** alokuj_pamiec( int kolumny, int wiersze ) { int ** nazwa_tablicy =( int ** ) malloc( wiersze * sizeof( int * ) ); for( int i = 0; i < kolumny, i++ ) { nazwa_tablicy[ i ] =( int * ) malloc( kolumny * sizeof( int ) ) } return nazwa_tablicy; }
//reasumując. Przytaczam przykład programu gotowego do kompilacji (choć z wyciekiem pamięci bo trzeba dopisać zwolnienie zasobów) #include<iostream>
int ** alokuj_pamiec( int kolumny, int wiersze ) { int ** nazwa_tablicy =( int ** ) malloc( wiersze * sizeof( int * ) ); for( int i = 0; i < kolumny; i++ ) { nazwa_tablicy[ i ] =( int * ) malloc( kolumny * sizeof( int ) ); } return nazwa_tablicy; } void zwolniPamiec( int ** tab, int wiersze ) { }
int main() { int wiersze = 5; int kolumny = 6; int ** mojaTablica2D = alokuj_pamiec( kolumny, wiersze ); mojaTablica2D[ 1 ][ 5 ] = 132; std::cout << mojaTablica2D[ 1 ][ 5 ]; } |
|
« 1 » |