Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160

    [C] Mantenere valore tra le funzioni

    Ciao

    Mi trovo di fronte a questa situazione con cntOpenDatabases dichiarata come globale:

    codice:
    static int cntOpenDatabases=-1;
    
    int funz1(void){
       ++cntOpenDatabases;
       return cntOpenDatabases;
    }
    
    int funz2(int cntDat){
       cntOpenDatabases=cntDat;
       --cntOpenDatabases;
       return cntOpenDatabases;
    }
    Se io da un main chiamo prima funz1() --> cntOpenDatabases=0. Poi chiamo funz2() che riceve in pratica il valore prodotto da funz1() e --> cntOpenDatabases=-1. Ora se io richiamo funz1() --> cntOpenDatabases=1 (dopo l'incremento) mentre io voglio che sia uguale a 0 (cioè uguale al valore tornato da funz2. Come posso fare senza aggiungere o modificare i parametri di funz2() o di funz1()?

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Mi gira la testa! Non ho capito (quasi) nulla ...

    Magari mostra il main con quello che fai all'interno ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    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.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Manugal
    Il fatto è che non mostro tutto il codice perché poi ti girerebbe ancora di più la testa.
    No ... la testa mi girava per la spiegazione di cui non ho capito quasi nulla ...

    Tutto il codice non serve.

    Originariamente inviato da Manugal
    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.
    E questo e', secondo me sbagliato.

    Nei file include non si definiscono le variabili.

    Queste si definiscono in un file sorgente e poi si dichiarano come extern negli altri.

    Originariamente inviato da Manugal
    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.
    Quindi la OpenDatabase aumenta il numero e la CloseDatabase lo diminuisce.

    Originariamente inviato da Manugal
    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).
    E questo e' quello che vuoi ...

    Originariamente inviato da Manugal
    Subito dopo chiamo CloseDatabaseFile e questa funzione mi decrementa questa variabile.
    E anche questo e' quello che vuoi ...

    Originariamente inviato da Manugal
    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.
    Prova a dichiarare la variabile, come ti ho detto, in un solo modulo sorgente (non nell'include) e come extern nell'altro ...

    P.S. Due osservazioni ... nel primo esempio avevi scritto

    cntOpenDatabases=cntDat;

    ma questo non lo ritrovo nella CloseDatabase ...

    E alla fine della CloseDatabase scrivi

    return LPC_OK;
    putchar('\n');

    in cui, ovviamente, l'ultima istruzione non verra' mai eseguita.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Grazie 10000000000000!!!!!!!!

    Funziona alla perfezione ora! Proprio quello che volevo.

    Ciao.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.