[C] wypelnianie dziwnej tablicy dwuwymiarowej

0

mam zestaw kilku deklaracji i mam im dopasowac prototypy funkcji i napisac te funkcje, zrobilem 2/3 zadania, ktore dziala ok,
zostal mi taki fragment kodu oraz deklaracja funkcji, ktora ma wypelnic ta tablice:

        int **array2 = (int**)malloc(NROWS*sizeof(int*));
	array2[0]=(int*)malloc(NROWS*NCOLUMNS*sizeof(int));
	for (i=1; i<NROWS; i++)
	array2[i]=array2[0]+i*NCOLUMNS;
void f3(int **pp, int a, int b);

jak powinien wygladac kod funkcji, ktory wypelni ta tablice?
a czy ten kod alokujacy tablice ma w ogóle sens?

z gory dzieki za pomoc

0

Moje zmęczono oko podpowiada mi, że źle.
Źle alokujesz tablicę, jeśli już pierwsza definicja wskaźnika array2 ma sens, o tyle druga alokacja nie trzyma się kupy, bo tylko pierwszemu elementowi tej tablicy pokazujesz gdzie ma wskazywać i to jeszcze o wiele za dużo mu tam przydzielasz.
Powinieneś to zrobić w pętli, np tak:

for (int i = 0; i < NROWS; i++)
   array2[i] = (int*)malloc(NCOLUMNS * sizeof(int));

Ta pętla to nie wiem co miała robić Twoim zdaniem, ale się wysypie od razu (bo wskaźnik array2[1] wskazuje na nie wiadomo co).

Co do funkcji.
Jak już masz tablicę zadeklarowaną (btw. to jest tablica tablic, a nie dwuwymiarowa) to wysyłasz funkcji adres tej tablicy. Czyli:

f3(array2, NROWS, NCOLUMNS);

No i teraz sobie operujesz w funkcji wskaźnikiem p i normalnie korzystasz, np:

p[1][2] = 5;
0

to co podalem w tresci, to mialem sam podane w zadaniu :)

normalnie chyba nikt by nigdy tego przeciez nie napisal ;)

0
stfu napisał(a)

Moje zmęczono oko podpowiada mi, że źle.
Źle alokujesz tablicę, jeśli już pierwsza definicja wskaźnika array2 ma sens, o tyle druga alokacja nie trzyma się kupy, bo tylko pierwszemu elementowi tej tablicy pokazujesz gdzie ma wskazywać i to jeszcze o wiele za dużo mu tam przydzielasz.

A skad wiesz, ze za duzo skoro nie wiadomo ile ma NROWS i NCOLUMS ?

stfu napisał(a)

Powinieneś to zrobić w pętli, np tak:

for (int i = 0; i < NROWS; i++)
   array2[i] = (int*)malloc(NCOLUMNS * sizeof(int));

Ta pętla to nie wiem co miała robić Twoim zdaniem, ale się wysypie od razu (bo wskaźnik array2[1] wskazuje na nie wiadomo co).

Nie koniecznie tak musi robic, poniewaz jego sposobem alokuje naraz caly wymiar, przypisujac adres tego do array2[0], a nastepnie rozdziela kolumnami, przypisujac odpowiednie adresy w petli.

owen: do tego sposobu wystarczy, ze przelecisz w petli przez array2[0] i wypelnisz wszystkie elementy tego czym chcesz.

0

Fajna konstrukcja:) [edit: mowie o pierwszym poscie watku] ale nie chcialoby mi sie tak pisac, chyba ze fragmentacja pamieci by mnie zabijala przez za duza ilosc niezalignowanych kolumn. A jesli juz bym tak napisal, to hm.. cacheowac wskazniki do kolumn? A co, obliczanie ich offsetow w locie trwa dluzej niz +1levelofindirection? Hm.. szczerze, konstrukcja wyglada tak, jakby miala komus pomoc w jakims bardzo specyficznym przypadku..

Tak czy owak, jesli chcesz uzywac jej ładnie, zgodnie z jej konstrukcja i ideą pracy, to zwroc uwage, ze, po takiej konstrukcji:

array2[0] = wsk-na-kolumne0, w niej "rows" elementow
array2[1] = wsk-na-kolumne1, w niej "rows" elementow
..
array2[NCOL-1] = wsk-na-kolumne ostatnia, w niej "rows" elementow

czyli, chcac miec tablice/macierz np.:

123..N
123..N
123..N
123..N

for N=1,i=0 i<ncol ++i,++N
for j=0 j<rows ++j
array2[i][j] = N

czyli, mozesz na nia patrzec, jak macierz/tablice2D, tylko indeksowana najpierw po kolumnach, potem po wierszach

1 użytkowników online, w tym zalogowanych: 0, gości: 1