maybach Napisano 12 Grudnia 2004 Zgłoś Napisano 12 Grudnia 2004 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
yasin Napisano 12 Grudnia 2004 Zgłoś Napisano 12 Grudnia 2004 tablica jednowymiarowa -> tablica <-> tablica dwuwymiarowa -> tablica[k] <-> tablica[ i * k + k] trzy wymiary -> tablica[j][k] <-> tablica[i * j * k + k] itd. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
spicum Napisano 12 Grudnia 2004 Zgłoś Napisano 12 Grudnia 2004 [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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
ayem Napisano 12 Grudnia 2004 Zgłoś Napisano 12 Grudnia 2004 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] Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
spicum Napisano 12 Grudnia 2004 Zgłoś Napisano 12 Grudnia 2004 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 :> Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
ayem Napisano 12 Grudnia 2004 Zgłoś Napisano 12 Grudnia 2004 heh ja se do tego jezyka chyba nie przekonam :| Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
maybach Napisano 12 Grudnia 2004 Zgłoś Napisano 12 Grudnia 2004 wielkie dzieki za pomoc zadanko domowe zrobione :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
piotrek_zet Napisano 18 Grudnia 2004 Zgłoś Napisano 18 Grudnia 2004 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
ayem Napisano 18 Grudnia 2004 Zgłoś Napisano 18 Grudnia 2004 tylko ze nie tracisz juz czasu na kazdorazowe odwolywanie sie do TLBs zeby sprawdzic gdzie ajkurat siedzi drugi rzad ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
piotrek_zet Napisano 18 Grudnia 2004 Zgłoś Napisano 18 Grudnia 2004 własciwie to masz racje :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
_-bono-_ Napisano 31 Października 2005 Zgłoś Napisano 31 Października 2005 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...
_-bono-_ Napisano 31 Października 2005 Zgłoś Napisano 31 Października 2005 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach More sharing options...