Doriän
26-08-2007, 18:01
Salve! Torno di nuovo per un piccolo programmino che sto utilizzando a scopo didattico (e sul quale avevo già chiesto informazioni sul questa board, qui (http://www.hwupgrade.it/forum/showthread.php?t=1476589)). Mi sono, prevedibilmente, impantanato sull'allocazione dinamica. Dunque, il codice che mi crea problemi è il seguente:
variabili, penso sia utile metterle...
int lamp[MAX_LAMP], i, j=0, swap, flag=0, L=0, P=0, PulsCountr=1, IND_PUL=0,
IND_LUC=0;
char riga[100], comando[10], c;
typedef struct main_struct {
char *PUL;
int *LUCI;
} PULS;
PULS *PULSANTI;
FILE *fp;
...e resto di codice
/*Allocazione dinamica*/
PULSANTI = malloc(sizeof(PULS)); //allocazione dinamica di PULSANTI
if (PULSANTI==NULL) { //controllo errori su allocazione PULSANTI
printf("1- Errore durante l'allocazione dinamica della memoria.\n");
printf("Premere un tasto...");
getch();
return (EXIT_FAILURE);
} else {
PULSANTI->PUL = malloc(sizeof(char));
PULSANTI->LUCI = malloc(sizeof(int));
}
if (PULSANTI->PUL==NULL|| PULSANTI->LUCI==NULL) { //controllo errori su allocazione campi di PULSANTI
printf("1b- Errore durante l'allocazione dinamica della memoria.\n");
printf("Premere un tasto...");
getch();
return (EXIT_FAILURE);
}
//In questo while vengono letti e copiati i comandi
while (fgets(riga, sizeof(riga), fp) != NULL) {
if (isalpha(riga[0])) {
for (i=0; i<10; i++) {
if (isalpha(riga[i])) {
c = riga[i];
PULSANTI[j].PUL[IND_PUL] = c;
IND_PUL++;
printf("1\n");
} else if (isdigit(riga[i])) {
printf("2\n");
PULSANTI[j].LUCI[IND_LUC] = riga[i]-48; //todo: sistemare questa cagata
IND_LUC++;
}
}
j++;
IND_LUC = IND_PUL = 0;
PulsCountr++;
/*reallocazione dinamica*/
PULSANTI = realloc(PULSANTI, PulsCountr*sizeof(PULS));
if (PULSANTI==NULL) { //controllo errori su allocazione PULSANTI
printf("2- Errore durante l'allocazione dinamica della memoria.\n");
printf("Premere un tasto...");
getch();
return (EXIT_FAILURE);
} else {
PULSANTI->PUL = malloc(sizeof(char));
PULSANTI->LUCI = malloc(sizeof(int));
}
if (PULSANTI->PUL==NULL|| PULSANTI->LUCI==NULL) {
printf("2b- Errore durante l'allocazione dinamica della memoria.\n");
printf("Premere un tasto...");
getch();
return (EXIT_FAILURE);
}
printf("3\n");
}
}
(p.s., parte delle printf sono a scopo di debug volante, anche se uso Insight)
La prima acquisizione la fa alla grande (eh, magari per vedere cosa fa il programma potreste dare un'occhiata all'altro thread, altrimenti diventa troppo pesante - già così è un mattone!), ma appena cerca di accedere PULSANTI[j].PUL[IND_PUL] dopo la reallocazione segfaulta, il che mi fa pensare che vada ad accedere ad una porzione di memoria che non posso toccare. Quindi immagino di fare qualche errore nella reallocazione. Ho provato utilizzando la realloc, ma niente. Non mi da errori in fase di allocazione, quindi già è un qualcosa. Forse è un errore di dereferenziazzione? Non credo, ma....
grazie già di avermi prestato attenzione!
variabili, penso sia utile metterle...
int lamp[MAX_LAMP], i, j=0, swap, flag=0, L=0, P=0, PulsCountr=1, IND_PUL=0,
IND_LUC=0;
char riga[100], comando[10], c;
typedef struct main_struct {
char *PUL;
int *LUCI;
} PULS;
PULS *PULSANTI;
FILE *fp;
...e resto di codice
/*Allocazione dinamica*/
PULSANTI = malloc(sizeof(PULS)); //allocazione dinamica di PULSANTI
if (PULSANTI==NULL) { //controllo errori su allocazione PULSANTI
printf("1- Errore durante l'allocazione dinamica della memoria.\n");
printf("Premere un tasto...");
getch();
return (EXIT_FAILURE);
} else {
PULSANTI->PUL = malloc(sizeof(char));
PULSANTI->LUCI = malloc(sizeof(int));
}
if (PULSANTI->PUL==NULL|| PULSANTI->LUCI==NULL) { //controllo errori su allocazione campi di PULSANTI
printf("1b- Errore durante l'allocazione dinamica della memoria.\n");
printf("Premere un tasto...");
getch();
return (EXIT_FAILURE);
}
//In questo while vengono letti e copiati i comandi
while (fgets(riga, sizeof(riga), fp) != NULL) {
if (isalpha(riga[0])) {
for (i=0; i<10; i++) {
if (isalpha(riga[i])) {
c = riga[i];
PULSANTI[j].PUL[IND_PUL] = c;
IND_PUL++;
printf("1\n");
} else if (isdigit(riga[i])) {
printf("2\n");
PULSANTI[j].LUCI[IND_LUC] = riga[i]-48; //todo: sistemare questa cagata
IND_LUC++;
}
}
j++;
IND_LUC = IND_PUL = 0;
PulsCountr++;
/*reallocazione dinamica*/
PULSANTI = realloc(PULSANTI, PulsCountr*sizeof(PULS));
if (PULSANTI==NULL) { //controllo errori su allocazione PULSANTI
printf("2- Errore durante l'allocazione dinamica della memoria.\n");
printf("Premere un tasto...");
getch();
return (EXIT_FAILURE);
} else {
PULSANTI->PUL = malloc(sizeof(char));
PULSANTI->LUCI = malloc(sizeof(int));
}
if (PULSANTI->PUL==NULL|| PULSANTI->LUCI==NULL) {
printf("2b- Errore durante l'allocazione dinamica della memoria.\n");
printf("Premere un tasto...");
getch();
return (EXIT_FAILURE);
}
printf("3\n");
}
}
(p.s., parte delle printf sono a scopo di debug volante, anche se uso Insight)
La prima acquisizione la fa alla grande (eh, magari per vedere cosa fa il programma potreste dare un'occhiata all'altro thread, altrimenti diventa troppo pesante - già così è un mattone!), ma appena cerca di accedere PULSANTI[j].PUL[IND_PUL] dopo la reallocazione segfaulta, il che mi fa pensare che vada ad accedere ad una porzione di memoria che non posso toccare. Quindi immagino di fare qualche errore nella reallocazione. Ho provato utilizzando la realloc, ma niente. Non mi da errori in fase di allocazione, quindi già è un qualcosa. Forse è un errore di dereferenziazzione? Non credo, ma....
grazie già di avermi prestato attenzione!