PDA

View Full Version : [C] Errore di segmentazione


caramelleamare
09-01-2015, 12:04
Salve, questo codice mi da un erroe di segmentazione che non riesco a risolvere nonostante vari tentativi. Queste sono le strutture:

struct Prodotto{
char tipo[20];
int quantita[N_PROD];
}Prodotto[N_PROD] = {{"Caffe"},{"Tessuti"},{"Spezie"},{"Legno"},{"Ceramiche"}};

typedef struct {
int data;
struct Prodotto venduto;
}Giornata;

typedef struct {
char nome[20];
char cognome[20];
int codice;
Giornata* giornata[MAX_GIORNI];
}Agente;

Questa è la funzione che da problemi. Viene chiamata da un'altra funzione che le passa i due parametri, a sua volta ricevuti dal main. La prima funzione li usa e non da problemi. Questa va in segmentazione sulla scanf indicata dalla freccia:

void creaGiornate(Agente* ag, int i) {
int j, num_giorni;

printf("Quante giornate hai lavorato in questo mese? ");
scanf("%d", &num_giorni);
for(j = 0; j < num_giorni; j++) {
ag[i].giornata[j] = (Giornata*)malloc(sizeof(Giornata));
if(ag[i].giornata[j] == NULL) {
printf("Errore di allocazione!\n");
return;
}
printf("Inserisci il %d%c giorno di lavoro(da 0 a 30)", i + 1, 167);
-->> scanf("%d", &ag[i].giornata[j]->data);
inserisciVenduto(ag, i, j);
}
return;
}

Ho provato a passare doppi puntatori, a rendere "giornata" vettore di struct, o anche solo struct(ma a quel punto non va bene la malloc perche restituisce sempre un puntatore).
L'idea è una serie di Agenti(chieste all'utente), per ogni agente una serie di giornate(chieste all'utente), per ogni giornata la quantità venduta di ognuno dei prodotti. Potrei farlo con le liste e credo sarebbe più comodo, ma vorrei risolverlo prima così.
Se serve per testarlo posto tutto il codice.

dyablo96
09-01-2015, 15:18
utilizzi la malloc all'interno della funzione nel ciclo (e non so se la usi anche priama), sei mai andato a liberare la memoria?

ti dico questo perchè tempo fa avevo un problema simile, dopo un pò che il programma era in esecuzione si piantava e li ho notato che non liberavo mai la memoria :doh: :doh:

Daniels118
13-01-2015, 16:27
Se non hai ancora risolto ti conviene postare tutto il codice.