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

Zwracanie tablicy dynamicznej przez funkcje

Ostatnio zmodyfikowano 2016-12-14 18:07
Autor Wiadomość
GhostMaster
Temat założony przez niniejszego użytkownika
Zwracanie tablicy dynamicznej przez funkcje
» 2016-12-14 14:02:33
Witam
Posiadam program, w którego funkcji tworze sobie dynamiczna tablice, do której zapisuje wartości z pliku. Problem polega na tym, że pod koniec funkcji chciałbym zwrócić całą tablice do głównego programu i nie wiem jak to zrobić.
C/C++
int czytaj( FILE * plik_we, int * wymx, int * wymy ) {
   
    int i, j;
   
    /* tablica dynamiczna */
    int( * tablica )[ * wymx ];
    tablica =( int( * )[ * wymx ] ) malloc( * wymx ** wymy * sizeof( int ) );
   
   
    /* zapisanie w tablicy */
    for( i = 0; i <* wymy; i++ ) {
        for( j = 0; j <* wymx; j++ ) {
            fscanf( plik_we, "%d", &( tablica[ i ][ j ] ) )
        }
    }
   
    return tablica;
}
Czy mógłby mi ktoś podać najłatwiejszy sposób jak to zrobić.
P-154904
michal11
» 2016-12-14 14:39:02
Ale ty chcesz zrobić tablice jednowymiarową czy dwuwymiarową?

Dla jednowymiarowej wystarczy
C/C++
int * tab =( int * ) malloc( nums * sizeof( int ) );

dla wielowymiarowej
C/C++
int ** tab2 =( int ** ) malloc( numx * sizeof( int * ) );

for( int i = 0; i < numx; ++i )
{
    tab2[ i ] =( int * ) malloc( numy * sizeof( int ) );
}

chyba jakoś tak, pisałem z głowy i dawno nie musiałem tak tworzyć tablic więc może być jakiś błąd ale ogólnie idea jest chyba poprawna.

int( * tablica )[ * wymx ];
.
Niech mnie ktoś poprawi jeżeli się mylę, ale mi to wygląda na deklarację wskaźnika na tablicę "statyczną".
P-154905
Gibas11
» 2016-12-14 15:15:34
Nie zgadza ci się też zwracany typ.
int ** czytaj( FILE * plik_we, int * wymx, int * wymy )
 dla tablicy dwuwymiarowej a
int * czytaj( FILE * plik_we, int * wymx, int * wymy )
 dla jednowymiarowej.
P-154907
GhostMaster
Temat założony przez niniejszego użytkownika
» 2016-12-14 16:32:15
@michal11 Chce utworzyć tablice dwuwymiarową. Wcześniej robiłem tak jak pisałeś. Ogólnie to w obydwu sposobach tablica tworzy się poprawnie.
@Gibas11 Zmieniłem typ na taki jak podałeś(do tablicy dwuwymiarowej) i zwracanie działa już prawidło.
Problem mam tylko z tym, że nie wiem w jaki sposób mogę na tej tablicy operować już w programie głównym. Żeby pozmieniać jej wartości w poszczególnych komórkach czy chociażby ją wydrukować.
P-154912
czaffik
» 2016-12-14 16:48:58
Dla tablicy dwuwymiarowej będzie działać tak:

C/C++
int ** tab = czytaj( f, wymx, wymy );
int i = 0;
int j = 0;
printf( "%d ", tab[ i ][ j ] );

Musisz tylko pamiętać żeby nie wyjść poza zakres tablicy bo bzdury wyjdą.
Mi ten twój sposób deklarowania tablicy dwuwymiarowej nie działa jak trzeba, pluje się że nie można tego przypasować do int**, za to jak podaje @michal11 działa więc się zastanawiam czy to od kompilatora zależy??
P-154914
michal11
» 2016-12-14 18:07:37
Możesz tworzyć tablicę 2d jako 1d ale wtedy sam musisz zadbać o poprawne odwoływanie się do indeksów i coś takiego
tab[ i ][ j ]
 nie zadziała, trzeba prawdopodobnie tak
tab[ i * sizey + j ]
 
P-154923
« 1 »
  Strona 1 z 1