[C] Przekazywanie do funkcji tablic 2-wymiarowych


(Manonim93) #1

Cześć, piszę sobie program i natrafiam na dziwny błąd, przy parametrach funkcji które operują na dwuwymiarowych tablicach.

Mój kod:

int plansza[SIZE][SIZE]; //zmienna globalna

int reset(int** tab)

{

	int i, j;

	for(i=0; i
		for(j=0; j
			tab[i][j]=0;

	return 1;

}

int pokaz(int **tab)

{

	int i, j;

	for(i=0; i
	{

		for(j=0; j
		{

			g_print("%d ",tab[i][j]);

		}

		g_print("\n");

	}

	return 1;

}

Kompilacja:

gcc -Wall "main.c" -o "main" `pkg-config --cflags gtk+-2.0 --libs gtk+-2.0` (w katalogu /home/michal/Projekty/test)

main.c: In function ‘main’:

main.c:8:2: warning: passing argument 1 of ‘reset’ from incompatible pointer type [enabled by default]

test.c:89:5: note: expected ‘int **’ but argument is of type ‘int (*)[10]’

main.c:9:2: warning: passing argument 1 of ‘pokaz’ from incompatible pointer type [enabled by default]

test.c:97:5: note: expected ‘int **’ but argument is of type ‘int (*)[10]’

Kompilacja została ukończona pomyślnie

Oczywiście funkcję w main wywołuję tak:

reset(plansza);

(Johny) #2

int pokaz (int tab[][]) /pokazujesz mu,że chodzi o dwuwymiarową tablicę

{

}

wskażnik jest tylko adresem pamięci do pierwszego elementu,on nie rozróżnia rozmiaru tablicy,stąd ten błąd,to tak jakby funkcja miała dostać dwa różne adresy

a to wygląda tak

int tab[3][3]

tab: // tak naprawdę adres tego miejsca przekazujesz,nie czy tablica jest dwuwymiarowa

0 1 2 3

0 1 2 3

0 1 2 3

0 1 2 3

C numeruje tablicę od 0,element zerowy jest pierwszym elementem tablicy.

Na początku wszystkie elementy są zerami.

Co do wskażnika

int pokaż(int *tab_[j])_


(Manonim93) #3

Po zastosowaniu się do twojej rady oprócz wcześniejszych błędów pojawia się:

test.c:89:15: error: array type has incomplete element type

Nie wiem czemu to nie działa, czy przez to że kompiluję z GTK, czy kompilator jest zbyt upierdliwy? Nie wiem. Zawsze przekazywanie tablicy przez wskaźnik przecież działało :confused:


(etam) #4

Ale tylko pierwszy wymiar może być nieokreślony, więc musi być co najmniej "int pokaz (int tab[]) {...}", albo lepiej "int pokaz (int tab) {...}"