Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tablica wielowymiarowa jako parametr funkcji

Ostatnio zmodyfikowano 2016-05-12 06:37
Autor Wiadomość
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):
 
C/C++
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' ) )
        {
            //printf("mam cyfre!!! %c\n", x);
            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:
 
 
C/C++
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:
C/C++
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:
C/C++
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:
C/C++
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 );
}
P-148136
mateczek
» 2016-05-12 06:37:37
błąd który się od razu rzuca w oczy to sposób alokacji tablicy
C/C++
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 );
    }
    // taka metoda nie ustawi ci wskaźnika nazwa_tablicy na żądaną wartość ustawi Ci zmenną lokalną!!!
w c++ mógłbyś to obeść referencją


C/C++
alokuj_pamiec( int ** & nazwa_tablicy, int kolumny, int wiersze ) {
    //kod
}

w C musisz albo przekazać wskaźnik na wskaźnik!!
C/C++
alokuj_pamiec( int *** nazwa_tablicy, int kolumny, int wiersze ) {
   
}
albo prościej:
C/C++
int ** alokuj_pamiec( int kolumny, int wiersze ) {
   
    //   int ** nazwa_tablicy =( int ** ) malloc( wiersze * kolumny * sizeof( int ) ); // tego też nie rozumiem !!!
    // dla tablicy dwówymiarowej to chyba tak ??
    int ** nazwa_tablicy =( int ** ) malloc( wiersze * sizeof( int * ) ); //wskaźniki na wiersze!!!
    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)


C/C++
#include<iostream>   // c++ nie wiem jak się w c wyświetla :P

int ** alokuj_pamiec( int kolumny, int wiersze ) {
   
    //   int ** nazwa_tablicy =( int ** ) malloc( wiersze * kolumny * sizeof( int ) ); // tego też nie rozumiem !!!
    // dla tablicy dwuwymiarowej to chyba tak ??
    int ** nazwa_tablicy =( int ** ) malloc( wiersze * sizeof( int * ) ); //mamy tablice wskaźników na całe wiesze.  int* nazwa_tablicy[]
    for( int i = 0; i < kolumny; i++ ) {
        nazwa_tablicy[ i ] =( int * ) malloc( kolumny * sizeof( int ) ); // alokacja pamięci dla poszczególnych wierszy
    }
   
    return nazwa_tablicy;
}
void zwolniPamiec( int ** tab, int wiersze ) {
    // tutaj zwolnienie bo wycieki
}


int main() {
    int wiersze = 5;
    int kolumny = 6;
   
    int ** mojaTablica2D = alokuj_pamiec( kolumny, wiersze );
   
    mojaTablica2D[ 1 ][ 5 ] = 132;
    std::cout << mojaTablica2D[ 1 ][ 5 ]; // c++ bo nie wiem jak się w C wyświetla :P
   
   
}
P-148139
« 1 »
  Strona 1 z 1