Skocz do zawartości
maybach

Dynamiczna alokacja tablicy wielowymiarowej w C

Rekomendowane odpowiedzi

Witam.

 

Mam pytanie: jak przy uzyciu funkcji malloc/calloc zaalokowac dynamicznie tablice dwuwymiarowa??

 

Wiem jak zaalokowac tablice jednawymiarowa, a dwu- i wiecej juz nie :(

 

Dzieki z gory za pomoc.

Maybach

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

[php:1:ea7b8395b0]

int i = 0;

int j = 0;

 

int ** tab;

tab = (int**)malloc(sizeof(int*)*20);

for (i = 0; i<20; i++)

{

tab = (int*)malloc(sizeof(int)*20);

}

 

/* to oczywiscie jest tylko do testu :>

 

for (i = 0; i<20; i++)

{

for (j = 0; j<20; j++)

{

tab[j] = i+j;

}

}

 

 

for (i = 0; i<20; i++)

{

for (j = 0; j<20; j++)

{

printf("tab[%d][%d]=%dn ",i,j,tab[j]);

}

}

*/

[/php:1:ea7b8395b0]

 

za 20 podstaw sobie odpowiednie dlugosci , za int jaki tam chcesz typ.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

spicum - bardzo nieefektywne - kazdy rzad bedzie gdzie indziej w pamieci :|

 

[php:1:a2764c7fd9]

int w=3,k=3;

double *tab = (double)malloc(w*k*(unsigned)sizeof(double));

 

//a potem odwolanie do el [j] realizujesz przez:

tab[i*k+j];

 

 

[/php:1:a2764c7fd9]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

oczywiscie ze nieefektywnie - ale jak ktos bardzo chce miec ilestam wymiarow nie operujac na parametrach 1 wymiarowej tablicy to dlaczego nie ?

Przyznaje sie bez bicia - nie uzylem tablic od 2 lat w kodzie i dobrze mi z tym ...

Niech zyja kontenery javy :>

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

spicum - bardzo nieefektywne - kazdy rzad bedzie gdzie indziej w pamieci :|

 

[php:1:3c063dbc87]

int w=3,k=3;

double *tab = (double)malloc(w*k*(unsigned)sizeof(double));

 

//a potem odwolanie do el [j] realizujesz przez:

tab[i*k+j];

 

 

[/php:1:3c063dbc87]

z tą niefektywnoscia to niebylbym taki pewien, jesli bedziesz tablicy uzywal bardzo czesto to jednak te mnozenia adresowe tez nabiorą wagi

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

czesc.napisalem program najpierw na statycznej definicji tablicy dwuwywmiarowej i musze go przerobic na dynamiczna alokacje tej samej tablicy,musze w linijce wywolania programu podac rozmiar.mecze sie z tym juz dlugo,pol dnia grzebie po forach,tak tez ti trafilem.doszedlem do momentu gdzie juz sie kompiluje ale podczas wywolania wyskakuje blad ze wystapil problem z aplikacja.pomozcie mi bo mam juz dosc :mur:

oto kod:

#include <iostream.h>#include <stdlib.h>main(int argc,char *argv[]){unsigned int rozmiar;rozmiar=atoi(argv[1]);//const int rozmiar=10;//cout << "podaj rozmiar tablicy: ";//cin >> rozmiar;int **tab;tab=(int **)malloc(rozmiar*sizeof(*tab));// Zamiast calloc(n,sizeof(typ)) mozna zastosowac malloc(n*sizeof(typ))if (tab == NULL)  // if (!tab)	{  cerr << "Alokacja pamieci sie nie powiodla!" << endl;  return EXIT_FAILURE;	}	else  cout << "Tablica utworzona w dostepnym zapasie pamieci!" << endl;if (rozmiar<1) cout << "Podaj liczbe naturalna!" << endl;else{  //wypelnienie tablicy liczbami -1    for (int w=0;w<rozmiar;w++)    {        for (int k=0;k<rozmiar;k++)        {          tab[w][k]= -1;        }    }//wypelnienie tablicy szachownica    int m=rozmiar;    for (int w=0;w<rozmiar;w++)    {        for (int k=0;k<m;k++)        {          if ((w+2)%2==0)          {          if ((k+2)%2!=0)          tab[w][k]= 0;          else          tab[w][k]= 1;          }          else           {          if ((k+2)%2!=0)          tab[w][k]= 1;          else          tab[w][k]= 0;          }                  }        m--;    }  //wydruk tablicy  for (int w=0;w<rozmiar;w++)    {        for (int k=0;k<rozmiar;k++)        {          cout << tab[w][k] << "\t";        }      cout << endl;    }}free (tab);}
sory ze jest tam tyle smieci ale juz dlugo z tym walcze.

ayem probowalem Twoj sposob ale wyskakiwal blad przy kompilacji

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

juz sobie poradzilem :)

jakby ktos byl zainteresowany lub szukal w przyszlosci:

sama alokacja pamieci:

int **tab;tab=(int **)malloc(rozmiar*sizeof(int*));for (int w=0;w<rozmiar;w++) tab[w]=(int*)malloc(rozmiar*sizeof(int));//i zwalnianiefor (int w=0;w<rozmiar;w++)free (tab[w]);free (tab);
pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...