Ciao.
Ho alcuni problemi con la return di una mia funzione. Praticamente la funzione è la seguente:
Il codice che testa la mia funzione invce è il seguente:codice:#include "LPC_M2_Include.h" #include <string.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <stdlib.h> #define DBF_NAME_LENGTH 10 #define MAX_DBF_OPEN 32 #define DBF_EXTENSION ".dbf" #define DBF_OPEN_EXT ".$$$" #define DBF_FILENAME_LENGTH DBF_NAME_LENGTH+1+3 int OpenDatabaseFile (char *Name){ int cntOpenDatabases=-1; int numerorecords; int test; char *filename; infohandle ihndl[MAX_DBF_OPEN]; char *filenameopen; if((Name==NULL) || (cercaErr(Name))){ char Err[256]; (void) sprintf(Err, "Nome DB nullo o non valido"); LPC_GestioneErrore(LPC_BAD_ARG, "OpenDatabaseFile", Err); return LPC_BAD_ARG; } if(strlen(Name)>=DBF_NAME_LENGTH) Name[DBF_NAME_LENGTH+1]='\0'; filename=(char *)malloc(sizeof(char)*DBF_FILENAME_LENGTH); sprintf(filename,"%s%s", Name, DBF_EXTENSION); if(filename==NULL){ char Err[256]; (void) sprintf(Err, "Errore di allocazione memoria"); LPC_GestioneErrore(LPC_NO_MEMORY, "OpenDatabaseFile", Err); return LPC_NO_MEMORY; } if(access(filename,F_OK)!=0){ char Err[256]; (void) sprintf(Err, "File non esistente o non accessibile"); LPC_GestioneErrore(LPC_FILE_ACCESS, "OpenDatabaseFile", Err); if(filename!=NULL) free(filename); return LPC_FILE_ACCESS; } filenameopen=(char *)malloc(sizeof(char)*DBF_FILENAME_LENGTH); sprintf(filenameopen,"%s%s", Name, DBF_OPEN_EXT); if(filenameopen==NULL){ char Err[256]; (void) sprintf(Err, "Errore di allocazione memoria"); LPC_GestioneErrore(LPC_NO_MEMORY, "OpenDatabaseFile", Err); if(filename!=NULL) free(filename); return LPC_NO_MEMORY; } if(access(filenameopen,F_OK)==0){ char Err[256]; (void) sprintf(Err, "DBF già aperto"); LPC_GestioneErrore(LPC_DBF_OPEN, "OpenDatabaseFile", Err); if(filenameopen!=NULL) free(filenameopen); if(filename!=NULL) free(filename); return LPC_DBF_OPEN; } ++cntOpenDatabases; if(cntOpenDatabases>MAX_DBF_OPEN){ char Err[256]; (void) sprintf(Err, "Massimo numero di DBF aperti"); LPC_GestioneErrore(LPC_NO_SPACE, "OpenDatabaseFile", Err); if(filename!=NULL) free(filename); return LPC_NO_SPACE; } FILE *fp=fopen(filenameopen,"rb+"); if(fp==NULL){ char Err[256]; (void) sprintf(Err, "Errore di allocazione memoria"); LPC_GestioneErrore(LPC_NO_MEMORY, "OpenDatabaseFile", Err); if(filenameopen!=NULL){ remove(filenameopen); free(filenameopen); } if(filename!=NULL) free(filename); return LPC_NO_MEMORY; } ihndl[cntOpenDatabases].handle=cntOpenDatabases; test=fseek(fp, sizeof(header)+1, SEEK_SET); if(test!=0){ char Err[256]; (void) sprintf(Err, "Errore di spostamento su file"); LPC_GestioneErrore(LPC_ERR_SEEK, "OpenDatabaseFile", Err); rewind(fp); if(filenameopen!=NULL){ remove(filenameopen); free(filenameopen); } if(filename!=NULL) free(filename); return LPC_ERR_SEEK; } ihndl[cntOpenDatabases].currentRec=1; ihndl[cntOpenDatabases].fp=fp; sprintf(ihndl[cntOpenDatabases].name, "%s", Name); fclose(fp); remove(filenameopen); free(filenameopen); free(filename); return ihndl[cntOpenDatabases].handle; putchar('\n'); }
Il problema è che in questi ultimi due test mi dà sempre l'errore relativo a "Errore di allocazione memoria". Inserendo, per provare, alcune printf qua e là mi sono accorto che praticamente questo errore mi viene tornato dal file pointer fp. Quindi, come controprova, ho inserito un controllo per verificare se il file con estensione .$$$ esistesse e infatti come pensavo, mettendo questo controllo, mi ritorna l'errore "File inesistente". Questo mi sembra molto strano. Voi che ne dite?codice:/* Test per verificare la funzionalità della funzione */ int handle; remove("Prova.$$$"); /* Il file con questa estensione identifica un file aperto */ handle = OpenDatabaseFile("Prova"); if (handle >= 0) OK TEST PASSATO! /* Test per verificare che il file sia aperto */ int ret; ret = OpenDatabaseFile("Prova"); if(ret<0) OK TEST PASSATO!
Grazie e scusate per la lunghezza del post ma ho cercato di farvi vedere il problema in modo più chiaro.

Rispondi quotando
