[C] jak przekazac tab[n][n] do funkcji o param. typu *** ?

0

Mam taki kod:

#include <stdio.h>

const int FALSE = 0;
const int TRUE = 1;

typedef int BOOL;

struct droga
{
	int miasto;
	int uzywana;
};

void Zeruj(struct droga ***mapa, int ilosc)
{
	int i, j;
	for(i = 0; i < ilosc; i++)
		for(j = 0; j < ilosc; j++)
			mapa[i][j] = NULL;
}

BOOL Szukaj(struct droga ***mapa, int ilosc, int numer)
{
		int i;	
		if (numer >= ilosc)
			return TRUE;
		for (i = 0; i < ilosc; i++)
		{
			if (mapa[numer][i])
			{
				if (mapa[numer][i]->uzywana == 0)
				{
					mapa[numer][i]->uzywana = 1;
					mapa[numer][i]->miasto = numer;
					mapa[i][numer]->uzywana = 1;
					mapa[i][numer]->miasto = numer;
					if (!Szukaj(mapa, ilosc, numer+1))
					{
						mapa[numer][i]->uzywana = 0;
						mapa[numer][i]->miasto = 0;
						mapa[i][numer]->uzywana = 0;
						mapa[i][numer]->miasto = 0;
					}
					else
					{
						return TRUE;
					}
				}
			}
		}
	return FALSE;
}

int main()
{
	int n ,m;
	scanf("%d %d", &n, &m);
	struct droga* mapa[n][n];
	Zeruj(mapa, n);
	int i;
	for (i = 0; i < m; i++)
	{
		int a, b;
		scanf("%d %d", &a, &b);
		struct droga *temp = (struct droga*)malloc(sizeof(struct droga));
		temp->uzywana = FALSE;
		temp->miasto = 0;
		mapa[a][b] = temp;
		mapa[b][a] = temp;
	}
	if (m < n)
		printf("NIE");
	if (Szukaj(mapa, n, 0))
		printf("TAK");
	else
		printf("NIE");
	return 0;
}

Jednak gdy go kompiluję dostaję takie błędy:

zadanie.c: In function 'main':
zadanie.c warning: passing argument 1 of 'Zeruj' from incompatible pointer type
zadanie.c warning: incompatible implicit declaration of built-in function 'malloc'
zadanie.c warning: passing argument 1 of 'Szukaj' from incompatible pointer type

Jak mam przekazać zmienną mapa do funkcji Zeruj() i Szukaj(), próbowałem już na różne sposoby, ale nie wychodzi mi.

0

nie uda Ci sie tego przekazac w taki sposob. naglowek funkcji mowi, ze wymaga:

  • wskaznikna (albo dyntablica)
  • wskaznikna (albo dyntablice)
  • wskaznikna (albo dyntablice)
  • struct droga

podczas gdy to co Ty masz w main, defacto jest typu:

  • stattablica[10]
  • stattablic[10]
  • wskaznikowna(albo dyntablic)
  • struct droga

dopasowywalne sa jedynie najnizsze szczeble, ale to nie wystarczy.. musi pasowac caly typ. nie mozna skonwertowac stattab-stattab-xxx'ow do wskaznik-na-wskanzik-na-xxx, poniewaz odwolywanie sie do takich tablic jest CALKOWICIE inaczej przeliczane
[jakby Ci sie nudzilo.. Tablice i wskaźniki, skomplikowana składnia]

jesli chcesz dynamicznie stworzyc sobie kwadratowa tablice NxN mozesz to zrobic na dwa sposoby

  • zaalokowac ja jako w pelni dynamiczna (dyn-dyn) droga** - i tak ja przekazac do funkcji o parametrze droga**
  • zaalokowac ja jako statyczna - tak jak robisz - droga[n][n], nastepnie przekazac adres jej pierwszego elementu do funkcji o parametrze droga* ORAZ przkazac wielkosc N ORAZ wewnatrz funkcji samodzielnie wyliczac wlasciwy adres:
struct droga zmienna[10][10];

func(zmienna, 10)

void func(droga* tab, int size)
{
....
    //zamiast tab[x][y] = 5
    tab[size * x  + y]  = 5;
....
}
0

Ok, rozumiem. Dzięki, a jeśli zdeklarowałbym funkcje tak:

void Szukaj(struct droga* mapa[][], int ilosc)

Czy wtedy by działało?

0

NIE.
Cały problem w tym, że tablica w C/C++ jest bardzo prostym obiektem i nie posiada żadnych informacji o swoim wymiarze.
Dlatego wymiary tablicy ten powinien być znany podczas kompilacji. Tylko pierwszy wymiar takiej tablicy może być nieznany.
Czemu, to trudno wytłumaczyć.

Jak rozwiązać ten problem?

  1. zastosować bibliotekę STL vector (w czystym C nie zadziała)
  2. zrobić tablicę jednowymiarową i samemu ją traktować jak dwuwymiarową, czyli:
tablicaJednowymiarowa[ nr_kolumny + nr_wiersza * liczba_elementów_w_wierszu ]
0

jest 3 rozwiązanie:
zrób tablicę wskaźników do tablic jednowymiarowych:

int n ,m;
scanf("%d %d", &n, &m);
struct droga* mapa[n][n];
struct droga** mapa2[n];
for( i=0; i<n; ++i )
    mapa2[i] = mapa[i];

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