Ciao.
Ho alcuni problemi con la return di una mia funzione. Praticamente la funzione è la 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 codice che testa la mia funzione invce è il seguente:
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!
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?
Grazie e scusate per la lunghezza del post ma ho cercato di farvi vedere il problema in modo più chiaro.