Jack-Carter
04-07-2008, 15:58
Salve a tutti, ho incontrato un problema strano nella scrittura di un programma. Il programma legge dei predicati da un file di testo, <origine> <destinazione> fatto nel modo seguente:
input.txt
P1 P5
P2 P4
P1 P4
P4 P5
P5 P6
P2 P3
P3 P6
Man mano che legge una riga, controlla se <destinazione> è già stata trovata precedentemente, e in caso affermativo, inserisce <origine> in una matrice di caratteri presente nell'area di memoria con <destinazione>, spiegazione da cani lo so, ma guardando il codice si capisce. Il problema si verifica proprio quando rialloco questa matrice, ovvero durante l'esecuzione normale non sembrano esserci problemi, ma se provo ad eseguire il debug, si blocca. Ecco il codice
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct pr{
char **ori;
char *des;
struct pr *next;
int nori;
};
struct pr *newpr();
int main()
{
FILE *input;
input=fopen("input.txt", "r");
char line[7], ori[10], des[10] ;
int i, j, k, flag;
struct pr *head, *tmp, *tmpsc;
head=newpr();
tmp=newpr();
head=NULL;
while(fscanf(input, "%s %s", ori, des)!=EOF)
{
printf("%s %s\n", ori, des);
tmpsc=head;
flag=0;
tmp=newpr();
while((tmpsc!=NULL))
{
if(strcmp(tmpsc->des, des)==0)
{
printf("%s è già presente come origine\n", des);
tmpsc->ori=(char**)realloc(tmpsc->ori, tmpsc->nori+2*sizeof(char*));
tmpsc->ori[tmpsc->nori]=(char*)malloc(strlen(ori)*sizeof(char));
strcpy(tmpsc->ori[tmpsc->nori], ori);
tmpsc->nori=tmpsc->nori+1;
flag=1;
}
tmpsc=tmpsc->next;
}
if(flag==0)
{
tmp->des=malloc(strlen(des)*sizeof(char));
tmp->ori=(char**)malloc(sizeof(char*));
tmp->ori[0]=(char*)malloc(strlen(ori)*sizeof(char));
strcpy(tmp->des, des);
strcpy(tmp->ori[0], ori);
tmp->nori=tmp->nori+1;
tmp->next=head;
head=tmp;
//free(tmp);
}
}
return 0;
}
struct pr *newpr()
{
struct pr *newprt;
newprt=malloc(sizeof(struct pr));
if(newprt==NULL)
{
printf("ERRORE");
}
return newprt;
}
L'area evidenziata in rosso è quella che da problemi, spero possiate illuminarmi, grazie.
input.txt
P1 P5
P2 P4
P1 P4
P4 P5
P5 P6
P2 P3
P3 P6
Man mano che legge una riga, controlla se <destinazione> è già stata trovata precedentemente, e in caso affermativo, inserisce <origine> in una matrice di caratteri presente nell'area di memoria con <destinazione>, spiegazione da cani lo so, ma guardando il codice si capisce. Il problema si verifica proprio quando rialloco questa matrice, ovvero durante l'esecuzione normale non sembrano esserci problemi, ma se provo ad eseguire il debug, si blocca. Ecco il codice
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct pr{
char **ori;
char *des;
struct pr *next;
int nori;
};
struct pr *newpr();
int main()
{
FILE *input;
input=fopen("input.txt", "r");
char line[7], ori[10], des[10] ;
int i, j, k, flag;
struct pr *head, *tmp, *tmpsc;
head=newpr();
tmp=newpr();
head=NULL;
while(fscanf(input, "%s %s", ori, des)!=EOF)
{
printf("%s %s\n", ori, des);
tmpsc=head;
flag=0;
tmp=newpr();
while((tmpsc!=NULL))
{
if(strcmp(tmpsc->des, des)==0)
{
printf("%s è già presente come origine\n", des);
tmpsc->ori=(char**)realloc(tmpsc->ori, tmpsc->nori+2*sizeof(char*));
tmpsc->ori[tmpsc->nori]=(char*)malloc(strlen(ori)*sizeof(char));
strcpy(tmpsc->ori[tmpsc->nori], ori);
tmpsc->nori=tmpsc->nori+1;
flag=1;
}
tmpsc=tmpsc->next;
}
if(flag==0)
{
tmp->des=malloc(strlen(des)*sizeof(char));
tmp->ori=(char**)malloc(sizeof(char*));
tmp->ori[0]=(char*)malloc(strlen(ori)*sizeof(char));
strcpy(tmp->des, des);
strcpy(tmp->ori[0], ori);
tmp->nori=tmp->nori+1;
tmp->next=head;
head=tmp;
//free(tmp);
}
}
return 0;
}
struct pr *newpr()
{
struct pr *newprt;
newprt=malloc(sizeof(struct pr));
if(newprt==NULL)
{
printf("ERRORE");
}
return newprt;
}
L'area evidenziata in rosso è quella che da problemi, spero possiate illuminarmi, grazie.