braian
09-02-2008, 08:35
Il seguente codice mi va in segmentation fault al momento del ritorno dalla finzione "createf" richiamata nel main.
Ho fatto il debugger con DDD e mi pare che vada bene tranne che quando dovrebbe ritornare 0 e invecie va in seg fault.
Qualcuno può aiutarmi?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include <time.h> //per la gestione del time
#include <stdio.h>
int createf(const char *path,const char *mode,char* fmt,...) //funzione con numero di parametri variabile, i primi 2 servono per la fopen, il terzo è una stringa di formato per i parametri variabili. E'un errore nn passare la stringa di formato, al limite passarla vuota per non inserire metadati. Eventuali parametri in più rispetto a quelli specificati nella stringa di formato vengono ignorati.
{
va_list ap; //il puntatore a argomento
FILE* file; //il file da creare o modificare
FILE* filesave=fopen("save.sav","a"); //il file di salvataggio delle associazioni
int lung;
char str[1];
char* stringa;
char* sval;
float fval;
struct tm * t;
time_t tx;
if ((file=fopen(path, mode))==NULL)
{
printf("errore1");
}
fprintf(filesave,"%s,",path);
va_start(ap,fmt);
while(*fmt!='\0')
{
if(isalpha(*fmt)!=0)
{
lung=strcspn(fmt," ");
stringa=strncpy(str,fmt,lung);
if(fputs(stringa,filesave)==EOF) //scrive il nome del metadato
{
printf("errore2");//gestione errore in fputs
}
fmt=fmt+lung; //fmt punta al successivo formato di tipo metadato(%s,%n..)
if(isspace(*fmt)==0)
{
printf("errore3");//trattamento errore, non c'è lo spazio dopo il nome di metadato
}
fmt++;
if(*fmt=='%')
{
fmt++;
switch(*fmt)
{
case 's':
sval=va_arg(ap,char*);
fprintf(filesave,"%s,",sval);
fmt++;
break;
case 'n':
fval=va_arg(ap,double);
fprintf(filesave,"%f,",fval);
fmt++;
break;
case 'd':
t=va_arg(ap,struct tm*);
tx=mktime(t);
if (tx == (time_t) (-1))
{
printf ("Errore! %ld\n", (long int) tx); //trattamento errore data da rivedere
}
fprintf(filesave,"%d/%d/%d,",t->tm_mday,t->tm_mon+1,t->tm_year+1900);
fmt++;
break;
default :
printf("errore4");//trattamento errore formato sconosciuto
break;
}
}
else
{
printf("errore5");//gestione errore, non c'è % dopo il nome del metadato e lo spazio
}
}
}
fprintf(filesave,"\n");
return 0;
}
int createfwm(const char *path,const char *mode)
{
FILE* file;
FILE* filesave=fopen("save.sav","a"); //il file di salvataggio delle associazioni
if ((file=(fopen(path, mode)))==((FILE*)NULL))
{
return EOF; //gestione errore
}
fprintf(filesave,"%s\n",path);
if(fclose(filesave)==EOF)
{
return EOF; //gestione errore
}
return 1;
}
int main()
{
printf("tuttook0\n");
struct tm* tempo;
tempo->tm_year=150;
tempo->tm_mday=15;
tempo->tm_mon=5;
char car;
int a=createfwm("prova.pro","w");
int b=createfwm("provi.pri","w");
int c=createfwm("prove.pre","w");
printf("tuttook1");
int d=createf("provu.pru","w","proprietario %srevisione %ndata %d","paolo",5,tempo);
printf("tuttook2");
FILE* fil=fopen("save.sav","r");
while((car=fgetc(fil))!=EOF)
{
if(car=='\0')
printf("errore");
}
printf("tuttook");
fclose(fil);
return 1;
}
L'errore che DDD mi da è:
Error accessing memory address 0x86f6972: Input/output error
Ho fatto il debugger con DDD e mi pare che vada bene tranne che quando dovrebbe ritornare 0 e invecie va in seg fault.
Qualcuno può aiutarmi?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include <time.h> //per la gestione del time
#include <stdio.h>
int createf(const char *path,const char *mode,char* fmt,...) //funzione con numero di parametri variabile, i primi 2 servono per la fopen, il terzo è una stringa di formato per i parametri variabili. E'un errore nn passare la stringa di formato, al limite passarla vuota per non inserire metadati. Eventuali parametri in più rispetto a quelli specificati nella stringa di formato vengono ignorati.
{
va_list ap; //il puntatore a argomento
FILE* file; //il file da creare o modificare
FILE* filesave=fopen("save.sav","a"); //il file di salvataggio delle associazioni
int lung;
char str[1];
char* stringa;
char* sval;
float fval;
struct tm * t;
time_t tx;
if ((file=fopen(path, mode))==NULL)
{
printf("errore1");
}
fprintf(filesave,"%s,",path);
va_start(ap,fmt);
while(*fmt!='\0')
{
if(isalpha(*fmt)!=0)
{
lung=strcspn(fmt," ");
stringa=strncpy(str,fmt,lung);
if(fputs(stringa,filesave)==EOF) //scrive il nome del metadato
{
printf("errore2");//gestione errore in fputs
}
fmt=fmt+lung; //fmt punta al successivo formato di tipo metadato(%s,%n..)
if(isspace(*fmt)==0)
{
printf("errore3");//trattamento errore, non c'è lo spazio dopo il nome di metadato
}
fmt++;
if(*fmt=='%')
{
fmt++;
switch(*fmt)
{
case 's':
sval=va_arg(ap,char*);
fprintf(filesave,"%s,",sval);
fmt++;
break;
case 'n':
fval=va_arg(ap,double);
fprintf(filesave,"%f,",fval);
fmt++;
break;
case 'd':
t=va_arg(ap,struct tm*);
tx=mktime(t);
if (tx == (time_t) (-1))
{
printf ("Errore! %ld\n", (long int) tx); //trattamento errore data da rivedere
}
fprintf(filesave,"%d/%d/%d,",t->tm_mday,t->tm_mon+1,t->tm_year+1900);
fmt++;
break;
default :
printf("errore4");//trattamento errore formato sconosciuto
break;
}
}
else
{
printf("errore5");//gestione errore, non c'è % dopo il nome del metadato e lo spazio
}
}
}
fprintf(filesave,"\n");
return 0;
}
int createfwm(const char *path,const char *mode)
{
FILE* file;
FILE* filesave=fopen("save.sav","a"); //il file di salvataggio delle associazioni
if ((file=(fopen(path, mode)))==((FILE*)NULL))
{
return EOF; //gestione errore
}
fprintf(filesave,"%s\n",path);
if(fclose(filesave)==EOF)
{
return EOF; //gestione errore
}
return 1;
}
int main()
{
printf("tuttook0\n");
struct tm* tempo;
tempo->tm_year=150;
tempo->tm_mday=15;
tempo->tm_mon=5;
char car;
int a=createfwm("prova.pro","w");
int b=createfwm("provi.pri","w");
int c=createfwm("prove.pre","w");
printf("tuttook1");
int d=createf("provu.pru","w","proprietario %srevisione %ndata %d","paolo",5,tempo);
printf("tuttook2");
FILE* fil=fopen("save.sav","r");
while((car=fgetc(fil))!=EOF)
{
if(car=='\0')
printf("errore");
}
printf("tuttook");
fclose(fil);
return 1;
}
L'errore che DDD mi da è:
Error accessing memory address 0x86f6972: Input/output error