Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    problema errore di segmentazione

    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;

    }

  2. #2

    lol

    a una cosa.. lasciate perdere i commenti...
    ciao ciao

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    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 ...

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Originariamente inviato da 1v4n
    a una cosa.. lasciate perdere i commenti...
    Sì, ma tu non lasciar perdere il Regolamento di quest'area, in futuro.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.