PDA

Visualizza la versione completa : [C] Segmentations Fault


dk_giuse89
04-06-2010, 14:57
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.



#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/teaching/laurea/tlp/esami/testi/AnnoAccademico20062007/20070716.pdf

oregon
04-06-2010, 16:53
SarÓ per questa

strt==NULL;

riga?

dk_giuse89
04-06-2010, 20:31
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...

MacApp
05-06-2010, 10:27
Originariamente inviato da dk_giuse89


#define Max_name 25+1
#define db 1
#define year 366
#define inARG 7+1



consiglio veloce: USA LE PARENTESI!


#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:


#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.
;-)

dk_giuse89
06-06-2010, 19:41
Originariamente inviato da MacApp
consiglio veloce: USA LE PARENTESI!


#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:


#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.

Loading