PDA

Visualizza la versione completa : [C] Errore di segmentazione


1v4n
17-10-2007, 23:36
ciao a tutti..
ho un mega problema...
il programma funziona ma quando inserisco il terzo input si ferma.
il debug mi ha dato errore di segmentazione...

vi prego aiutoooo...

ps.l'esecuzione si ferma al secondo malloc




#include <stdio.h>
#include <string.h>

// Contiene info Rispetto a un rettangolo

struct Rett
{
char key[10];
char filePtr[10];
int x;
int y;
int r;
int c;
struct Rett *nextPtr;
struct Rett *prevPtr;
};
typedef struct Rett Rett;
typedef Rett *RETTPTR;


//il file passato viene aperto in lettura e ritorna il puntatore al FILE (ptr puntatore)

void ptFile(char file[],FILE *ptr)
{
if((ptr=fopen(file,"r"))==NULL)
printf("file non può essere aperto\n");
}


//verifica ke il puntatore non sia vuoto


int isEmpty(RETTPTR x)
{
return x==NULL;
}


//effetua la ricenrca di un nodo o foglia all'interno dell'albero

int FindRiv(RETTPTR sPtr,char *key)
{

int flag=0;
RETTPTR nextPtr=sPtr;
RETTPTR curPtr=sPtr;

if(strcmp(curPtr->key,key)==0)
{
printf("Trovato\n");
return 1;
}
else
{
while(strcmp(key,curPtr->key)>=0 && flag!=1)
{
if(strcmp(key,curPtr->key)==0)
return 1;
else
{
if(curPtr->nextPtr==NULL)
flag=1;
else
curPtr=curPtr->nextPtr;
}
}

while(strcmp(key,curPtr->key)<0 && flag!=1)
{
if(strcmp(key,curPtr->key)==0)
return 1;
else
{
if(curPtr->prevPtr==NULL)
flag=1;
else
curPtr=curPtr->prevPtr;
}
}
return 0;
}


}

// Stampa la lista dei gicimenti memorizzati

void Print(RETTPTR sPtr)
{
if (isEmpty(sPtr))
printf("lista vuota \n");
else
{
while(sPtr->prevPtr!=NULL)
sPtr=sPtr->prevPtr;
while(sPtr!=NULL)
{
printf("<- %s -> ",sPtr->key);
sPtr=sPtr->nextPtr;
}
printf("\n");
}

}

//ha dei problemiii!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!

void InsertRiv(RETTPTR *sPtr,RETTPTR *newPtr)
{

int flag=0,flag1=0;
RETTPTR prevPtr=NULL,nextPtr=NULL;
RETTPTR curPtr=*sPtr;
if(isEmpty(*sPtr))
{
(*newPtr)->prevPtr=NULL;
(*newPtr)->nextPtr=NULL;
*sPtr=*newPtr;
}
else
{
while(strcmp((*newPtr)->key,curPtr->key)>0 && flag!=1)
{
if(curPtr->nextPtr==NULL)
{
curPtr->nextPtr=*newPtr;
(*newPtr)->nextPtr=NULL;
(*newPtr)->prevPtr=curPtr;
flag=1;
}
else
curPtr=curPtr->nextPtr;
}
if(curPtr->prevPtr!=NULL && curPtr->nextPtr!=NULL && flag!=1)
{
(*newPtr)->nextPtr=curPtr;
(*newPtr)->prevPtr=curPtr->prevPtr;
prevPtr=curPtr->prevPtr;
prevPtr->nextPtr=*newPtr;
curPtr->prevPtr=*newPtr;

}
while(strcmp((*newPtr)->key,curPtr->key)<0 && flag1!=1)
{
if(curPtr->prevPtr==NULL)
{

(*newPtr)->nextPtr=curPtr;
curPtr->prevPtr=*newPtr;
(*newPtr)->prevPtr=NULL;
flag1=1;
}
else
curPtr=curPtr->prevPtr;
}
if(curPtr->prevPtr!=NULL && curPtr->nextPtr!=NULL && flag1!=1)
{
(*newPtr)->nextPtr=curPtr->nextPtr;
(*newPtr)->prevPtr=curPtr;
nextPtr=curPtr->nextPtr;
curPtr->nextPtr=*newPtr;
nextPtr->prevPtr=*newPtr;
}

}
}


void rilevamento(int x,int y,int r,int c,char *file,char *key,RETTPTR *sPtr)
{
RETTPTR newPtr=NULL;
if(isEmpty(*sPtr))
{
newPtr=(RETTPTR)malloc(sizeof(RETTPTR));
if(newPtr==NULL)
printf("fine Memoria\n");
else
{
newPtr->x=x;
newPtr->y=y;
newPtr->r=r;
newPtr->c=c;
strcpy(newPtr->filePtr,file);
strcpy(newPtr->key,key);
InsertRiv(sPtr,&newPtr);
}
}
else
{
if(FindRiv(*sPtr,key)==1)
printf("gia inserito con questo codice\n");
else
{
newPtr=(RETTPTR)malloc(sizeof(RETTPTR));
if(newPtr==NULL)
printf("fine Memoria\n");
else
{
newPtr->x=x;
newPtr->y=y;
newPtr->r=r;
newPtr->c=c;
strcpy(newPtr->filePtr,file);
strcpy(newPtr->key,key);
InsertRiv(sPtr,&newPtr);
}
}

}
}

int main(void)
{
int C,x,y,l,d,r,c;
char file[10],key[10],nkey[50];
RETTPTR rivPtr=NULL;
RETTPTR sPtRett=NULL;

printf("GIACIMENTI\n- r x y r c file o :Per effetuare un rilevamento\n- s o1 o2..on : Per Creare un sistema\n- v x y : Per conoscere il valore\n- a x y l d : Per conoscere l'area del rettangolo\n- f : Per Terminare\n\n- 't': per il test\n\n\n");
while((C=getchar())!='f')
{
switch(C)
{
case 'r':
scanf("%d%d%d%d%s%s",&x,&y,&r,&c,file,key);
rilevamento(x,y,r,c,file,key,&rivPtr);
break;
case 's':
scanf("%s",nkey);
break;
case 'v':
scanf("%d%d",&x,&y);
break;
case 'a':
scanf("%d%d%d%d",&x,y,l,d);
break;
case 't':
Print(rivPtr);
break;
}

}
return 0;

}

1v4n
17-10-2007, 23:38
a una cosa.. lasciate perdere i commenti...
ciao ciao

oregon
17-10-2007, 23:57
Quando scrivi

newPtr=(RETTPTR)malloc(sizeof(RETTPTR));

praticamente stai allocando lo spazio per un puntatore ... mi sa che dentro la sizeof devi usare la strutture Rett ...

alka
18-10-2007, 02:57
Originariamente inviato da 1v4n
a una cosa.. lasciate perdere i commenti...

Sì, ma tu non lasciar perdere il Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887) di quest'area, in futuro. :fagiano:

Loading