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

Odpowiedz Nowy wątek
2008-09-01 11:28
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:59: warning: passing argument 1 of 'Zeruj' from incompatible pointer type
zadanie.c:65: warning: incompatible implicit declaration of built-in function 'malloc'
zadanie.c:73: 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.

Pozostało 580 znaków

2008-09-01 12:20
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;
....
}


no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał

Pozostało 580 znaków

2008-09-01 13:11
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?

Pozostało 580 znaków

2008-09-01 13:34
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 ]

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2008-09-01 14:00
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];

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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