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

    [C] Segmentations Fault

    Salve, ho un problema con il seguente codice C.

    La funzione candida restituisce Segmentations Fault. In compilazione Code::Blocks restituisce una compilazione pulita con 0 errors, 0 warnigns, non riesco a capire perchè non appena vado ad usare la struttura in precedenza creata ottengo segmentations fault. Tale errore mi farebbe pensare ad un problema con il puntatore, cosa più comune se usassi una lista che di fatto non sto usando.

    Ho la certazza del corretto funzionamento della fase di allocazione della struttura, e del suo riempimento, questo perchè, subito dopo "queste due fasi" richiamo una funzione di debug che mi printa a video tutto il contenuto della struct.

    La funzione successiva è la "candida" che puntalmente finisce in seg. fault, non riuscendo a venirne a capo l'ho commentata e ricopiato nella funzione incriminata il codice della debug print....il risultato non cambia, sono fermo a questo maledetto segmentations fault.

    codice:
    #include    <stdio.h>
    #include    <stdlib.h>
    #include    <string.h>
    #define     Max_name 25+1
    #define     db 1
    #define     year 366
    #define     inARG 7+1
    
    /*+++++++++++++STRUTTURA DATI+++++++++++++*/
    
    typedef struct PostiLiberi{
        //---STAMPA---//
        int tmpA,J;
        //------------//
        //-ASSEGNAZIONE-//
        int ON;
        //--------------//
        int  bed,Year[year];
        char osp[Max_name],rep[Max_name];
        }B_Free;
    /*++++++++++++++++++++++++++++++++++++++++*/
    
    B_Free* Alloca(B_Free *,int);
    void Make_DB(B_Free *,FILE *);
    void db_PRINT(B_Free *,int);
    int cerco(B_Free *,char *,int);
    void bsy_PRINT(B_Free *,int,int,int);
    
    int main(){
        printf("\n Esempio file di imput ");
        printf("\n*************************");
        printf("\n6\ncto cardiologia 1\nmolinette cardiologia 1\ncto chirurgia 31\nmondovi chirurgia 3\nfossano neurologia 56\nverona orbitorio 15");
        printf("\n*************************\n");
    
        B_Free *strt;
        strt==NULL;
    
        FILE *fin1;
        char in1[inARG];
        int M_R,day,I;
    
        printf("Nome file: ");
        scanf("%s",in1);
        if((fin1=fopen(in1,"r"))==NULL){
            fprintf(stderr,"\nERROR!: I can't open your file %s ",in1);
            exit(EXIT_FAILURE);
          }
    
        fscanf(fin1,"%d",&M_R);
        if(db==1)
            fprintf(stdout,"\nDim struct:%d:",M_R );
    
        strt=Alloca(strt,M_R);
        //Leggo il file.
        Make_DB(strt,fin1);
        //Terminata la fase di acquisizione lo chiudi.
        fclose(fin1);
        if(db==1)
            db_PRINT(strt,M_R);
        //GESTIONE DEL MENU DI RICHIESTA DATI:
        printf("\nComando: ");
        scanf("%s %d",in1,&day);
        if(day<0)
            printf("\nPRENOTAZIONE NON EFFETTUATA");
            else{
                //INIZIA RICERCA DISPONIBILITA LETTO-GIORNI CONSECUTIVI. devi ritornare i del candidato prescelto. Se la ricerca fallsice I=-1.
               I=candida(strt,in1,M_R);
                if(I==-1)
                    printf("\nPRENOTAZIONE NON EFFETTUATA");
                    else{
                        //PRINTA' in modo definitivo il vettore Year della struct, Parametri da passare-> (strt,dim,n).
    
                    }
            }
    
        return 0;
        }
    
    B_Free* Alloca(B_Free *ptr,int dim){
        ptr=(B_Free*)malloc(dim*sizeof(B_Free));
        if(ptr==NULL){
            fprintf(stderr,"MALLOC FAILURE");
            exit (EXIT_FAILURE);
            }
        if(db==1)
            fprintf(stdout,"Memory request ok!");
        return(ptr);
        }
    
    void Make_DB(B_Free *ptr,FILE *dati){
        int i=0;
        while(fscanf(dati,"%s %s %d",ptr[i].osp,ptr[i].rep,&ptr[i].bed)!=EOF)
            i++;
    }
    
    void db_PRINT(B_Free *ptr,int dim){
        printf("\n*********DEBUG FUNCTIONS*********");
        int i=0;
            for(;i<dim;i++)
                printf("\n%s %s %d",ptr[i].osp,ptr[i].rep,ptr[i].bed);
        printf("\n------AND OF DEBUG FUNCTIONS-----");
    }
    
    
    
    
    /* FUNZIONE PRESENTA LO STESSO PROBLEMA.....NON ARRIVA A STAMPARE IL PRIMO IF
    
    int candida(B_Free *ptr,char *repa,int dim){
        int x=0,tmpX=-1,c,j=0;
            if(db==1)
                fprintf(stdout,"Parametri ricevuti: reparto : %s dim struct:%d \n",repa,dim);
        while(x!=dim){
                if(strcmp(repa,ptr[x].rep)==0 && ptr[x].bed>0){
                    if(db==1)
                        fprintf(stdout,"\n TROVATO REPARTO, LETTO FREE. next step [giorni liberi consecutivi].\n Salvo l'indice in di x in tmpX ");
                    tmpX=x;
                    //ricerco consecutivi..
                    //j fa scorrere tutto l'anno
                    j=0;
                    c=0;
                    while(c!=dim){
                        if(ptr[x].Year[j]==0){
                            c++;
                        }else
                            c=0;
                        j++;
                        if(j==365)
                            j=0;
                    }//QUANDO QUESTO CICLO TERMINA C CONTIENE IL GIORNO FINALE DELLA PRENOTAZIONE
                    }else
                    ptr[x].ON=-1;
            x++;
        }
        if(tmpX!=-1)
            return -1;
            else
                return tmpX;
    }
    
    
    */
    
    //LA SEGUENTE FUZNIONE E' IDENTICA ALLA FUNZIONE DI PRINT DEBUG...MA NON FUNZIONA.
    
    int candida(B_Free *ptr,char *repa,int dim){
        int tmpX=-1;
        int i=0;
         for(;i<dim;i++)
            printf("\n%s %s %d",ptr[i].osp,ptr[i].rep,ptr[i].bed);
        return tmpX;
    }
    
    void bsy_PRINT(B_Free *ptr,int dim,int I,int n){
        int J,x,tmp;
        //I indice ospedale da occupare.
        //J contine l'ultimo giorno occupato
        //n il n° di giorni di decenza. risalgo a quello inziale decrementandoli entrambi.
        for(x=0;x<dim;x++){
            if(ptr[x].tmpA==1){
                J=ptr[x].J;
            }
        }
        tmp=J;
        while(n!=0){
            ptr[I].Year[J]=1;
            J--;
            n--;
        }
        printf("Prenotazione effettuata in: %s dal:%d al:%d lettoNUMERO:%d",ptr[I].osp,J,tmp,ptr[I].bed);
    }
    Link dell'sercizio -> http://fmgroup.polito.it/quer/teachi...7/20070716.pdf

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Sarà per questa

    strt==NULL;

    riga?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Dopo un giorno che ci sbattevo la testa ho risolto.


    La lunghezza del vettore char, che contiene l'input digitato dalla tastiera non era sufficentemente lungo...


    Un errore che non mi era mai capitat banalissimo che mi ha fatto perdere 1 giorno...

  4. #4

    Re: [C] Segmentations Fault

    Originariamente inviato da dk_giuse89
    codice:
    #define     Max_name 25+1
    #define     db 1
    #define     year 366
    #define     inARG 7+1
    consiglio veloce: USA LE PARENTESI!
    codice:
    #define     qMaxName (25+1)
    #define     qDb 1
    #define     qYear 366
    #define     qInArg (7+1)
    ad esempio: qInArg*3 fa 24, mentre inARG*3 fa 11!

    dato che ci sei degli identificatori piu' significativi, unita ad una convenzione che ti permetta di identificare al volo se si tratta di una macro o no (ad esempio qui ho usato il prefisso "q"). In C in genere le macro si definiscono in maiuscolo, ma attento se scrivessi:
    codice:
    #define     MAX_NAME (25+1)
    #define     DB 1
    #define     YEAR 366
    #define     IN_ARG (7+1)
    rischieresti di andare in conflitto con altre macro.
    Un'alternativa potrebbe essere il mettere come prefisso il tuo acronimo.
    ;-)

  5. #5

    Re: Re: [C] Segmentations Fault

    Originariamente inviato da MacApp
    consiglio veloce: USA LE PARENTESI!
    codice:
    #define     qMaxName (25+1)
    #define     qDb 1
    #define     qYear 366
    #define     qInArg (7+1)
    ad esempio: qInArg*3 fa 24, mentre inARG*3 fa 11!

    dato che ci sei degli identificatori piu' significativi, unita ad una convenzione che ti permetta di identificare al volo se si tratta di una macro o no (ad esempio qui ho usato il prefisso "q"). In C in genere le macro si definiscono in maiuscolo, ma attento se scrivessi:
    codice:
    #define     MAX_NAME (25+1)
    #define     DB 1
    #define     YEAR 366
    #define     IN_ARG (7+1)
    rischieresti di andare in conflitto con altre macro.
    Un'alternativa potrebbe essere il mettere come prefisso il tuo acronimo.
    ;-)
    Ti ringrazio per i consigli.

    Sto preparando un esame e mi accorgo che il problema maggiore è l'organizzazione delle idee per le possibili soluzioni in poco tempo....La mia testa va ad incasinarsi sul codice gia "pensato" nel momento in cui devo far rifermento a varibili puntatori, flag....

    Grazie ancora.

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.