Il fatto è che non mostro tutto il codice perché poi ti girerebbe ancora di più la testa. Cmq se vuoi ti posto il codice completo delle due funzioni.
codice:
#include "LPC_Include.h"
#include "LPC_M2_Include.h"
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
int OpenDatabaseFile (char *Name){
int numerorecords;
int test;
char *filename;
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(filenameopen!=NULL)
free(filenameopen);
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);
cntOpenDatabases=-1;
if(filenameopen!=NULL)
free(filenameopen);
if(filename!=NULL)
free(filename);
return LPC_NO_SPACE;
}
FILE *fp=fopen(filename,"rb+");
FILE *fpopen=fopen(filenameopen,"wb+");
if(fp==NULL || fpopen==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;
}
fclose(fpopen);
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;
}
int i;
for(i=0; i<=MAX_DBF_OPEN; ++i)
if(ihndl[i].fp==NULL){
ihndl[i].h=cntOpenDatabases;
ihndl[i].currentRec=1;
ihndl[i].fp=fp;
sprintf(ihndl[i].name, "%s", Name);
break;
}
free(filenameopen);
free(filename);
return cntOpenDatabases;
}
codice:
int CloseDatabaseFile (int handle){
int test;
char *opennamefile;
opennamefile=(char *)malloc(sizeof(char)*DBF_FILENAME_LENGTH);
if(opennamefile==NULL){
char Err[256];
(void) sprintf(Err, "Errore di allocazione memoria");
LPC_GestioneErrore(LPC_NO_MEMORY, "CloseDatabaseFile", Err);
return LPC_NO_MEMORY;
}
sprintf(opennamefile, "%s%s", ihndl[handle].name, DBF_OPEN_EXT);
if(ihndl[handle].h!=handle){
char Err[256];
(void) sprintf(Err, "Handle non valido");
LPC_GestioneErrore(LPC_BAD_ARG, "CloseDatabaseFile", Err);
return LPC_BAD_ARG;
}
test=fclose(ihndl[handle].fp);
if(test!=0){
char Err[256];
(void) sprintf(Err, "Errore di chiusura file");
LPC_GestioneErrore(LPC_FILE_ACCESS, "CloseDatabaseFile", Err);
return LPC_FILE_ACCESS;
}
remove(opennamefile);
ihndl[handle].fp=NULL;
ihndl[handle].h=-1;
ihndl[handle].currentRec=-1;
--cntOpenDatabases;
return LPC_OK;
putchar('\n');
}
Le funzioni si trovano in due files separati.
Quella variabile cntOpenDatabases è dichiarata come static in un file .h incluso da entrambe le funzioni ed è inizializzata a -1. A me questa variabile serve perché mi conta i databases che sono stati aperti, però nel momento in cui ne chiudo uno il valore di questa variabile deve diminuire di 1. Il problema (cioè non è un vero e proprio problema perché una variabile static si comporta così) che si presenta è che se chiamo la OpenDatabaseFile il valore di cntOpenDatabases va a 0 (perché questa funzione lo incrementa). Subito dopo chiamo CloseDatabaseFile e questa funzione mi decrementa questa variabile. Ora se io richiamo OpenDatabaseFile il valore di quella variabile, dopo l'incremento, è 1, mentre io voglio che sia 0 (perché è stata decrementata da CloseDatabaseFile). Spero di essere stato chiaro.