Matrice di adiacenza

di il
4 risposte

Matrice di adiacenza

Buongiorno ho un problema di segmentation faul di questo codice e non riesco a trovarne la causa ho queste struct nel file .c:

struct poi_{
char* name;
int id;
};
struct street_{
bool street_exist;
bool* vehicle;
int* travel_time;
};
struct city_{
char* name;
poi* poi;
int n;
int max_dim;
street** streets;
};

faccio riferimento a queste struct tramite puntatori opachi nel .h:

typedef struct poi_* poi;
typedef struct street_* street;
typedef struct city_* city;

Il problema di segmentation fault si pone quando provo ad accedere agli elementi della matrice di adiacenza “street” in questa funzione:

int create_city(city c_, char* name_, int max_dim_ ){
max_dim_=3;
c_ = (city) malloc(sizeof(city));
c_ -> name = name_;
c_ ->n =0;
c_ ->max_dim = max_dim_ ;
c_ -> poi = (poi*) malloc(sizeof(poi)*max_dim_);// corretto
c_ -> streets = (street**) malloc(sizeof(street*) * max_dim_);
for(int i=0; i < max_dim_; i++){
c_ -> streets [i] = calloc(max_dim_, sizeof(street));
}
c_ ->streets[0][0]->street_exist = true; //segmentation fault qui
return OK;
}

4 Risposte

  • Re: Matrice di adiacenza

    Perché 

    c_ ->streets[0][0]

    ?

    Semmai

    c_ ->streets[i]

    nel ciclo

  • Re: Matrice di adiacenza

    09/06/2023 - oregon ha scritto:


    Perché 

    c_ ->streets[0][0]

    ?

    Semmai

    c_ ->streets[i]

    nel ciclo

    solo per motivi di test, una volta individuato che il prblema era l'accesso alla matrice ho provato con [0][0] fuori dal ciclo per vedere se almeno con il primo elemento andasse ma purtroppo non riesce ad accedere alla memoria.

  • Re: Matrice di adiacenza

    09/06/2023 - oregon ha scritto:


    Perché 

    c_ ->streets[0][0]

    ?

    Semmai

    c_ ->streets[i]

    nel ciclo

    solo per motivi di test, una volta individuato che il prblema era l'accesso alla matrice ho provato con [0][0] fuori dal ciclo per vedere se almeno con il primo elemento andasse ma purtroppo non riesce ad accedere alla memoria.

  • Re: Matrice di adiacenza

    I nomi “street", “city”, “poi” fanno riferimento a dei tipi puntatore, non al tipo principale. Sembra che ci sia un errore nelle malloc. Prova così:

    int create_city(city c_, char* name_, int max_dim_ ){
    max_dim_=3;
    c_ = (city) malloc(sizeof(city_));
    c_ -> name = name_;
    c_ ->n =0;
    c_ ->max_dim = max_dim_ ;
    c_ -> poi = (poi) malloc(sizeof(poi_)*max_dim_);// corretto
    c_ -> streets = (street*) malloc(sizeof(street) * max_dim_);
    for(int i=0; i < max_dim_; i++){
    c_ -> streets [i] = calloc(max_dim_, sizeof(street_));
    }
    c_ ->streets[0][0]->street_exist = true; //segmentation fault qui
    return OK;
    }

    PS: accertati di non aver sbagliato anche il nome, se lo hai allocato altrove. 

    PS 2: il campo poi non può chiamarsi come il tipo, ma penso che sia un errore di trascrizione. 

Devi accedere o registrarti per scrivere nel forum
4 risposte