Il seguente programma è di un progetto reale in cui occorreva definire due tipi di strutture dati.

Più avanti troverai anche la parte nello start.c.

Il codice è stato scritto in un file chiamato "ricettario.h" che è stato incluso nel common.

// ------------------------------------"ricettario.h"------------------------------------ //
#define numeroRicetteMax 10
#define coeffDecimali 1000    // ogni decimale è un x10 (quindi 3 decimali equaivale a 1000)
#define minutiAvvertimento 30
#define decimiAttesa 2

char pathProg[15] = "C:\\MW30632.fis";    // percorso relativo al file della prima serie di dati fissi
char pathAll[15] = "C:\\Allarm.fis";      // percorso relativo al file della seconda serie di dati fissi

// funzioni prima serie di dati fissi
void carica_fissiRic(void);
char salva_fissiRic(void);
void reset_fissiRic(void);

// primo tipo di struttura dati
typedef struct datifissiRic
{
    U16 first_time_df;                          // condizione di primo avvio
    
    unsigned char tipoLavoro_dfRic;             // 0 modalità start/stop - 1 modalità ciclo aperto/chiuso
    unsigned char livelloAperturaY2_dfRic;      // percentuale di apertura della valvola Y2 durante il normale esercizio
    unsigned char ritardoAperturaY2_dfRic;      // ritardo apertura valvola di Y2 nella fase di start
    unsigned char pressioneMinima_dfRic;        // pressione minima aria
    unsigned char pressioneMassima_dfRic;       // pressione massima aria
    unsigned char livelloChiusuraY2_dfRic;      // percentuale apertura valvola Y2 durante pulizia impianto in fase di stop
    unsigned char ritardoChiusuraY1Y3_dfRic;    // ritardo chiusura valvole Y1 e Y3
    
    // dalità ciclo
    char selLivelli_ric[numeroRicetteMax];                      // numero ionizzatori attivi
    char modaLavoro_ric[numeroRicetteMax];                      // 0 ciclo aperto - 1 ciclo chiuso
    unsigned char powerTimerEnable_dfRic[numeroRicetteMax];     // abilitazione fascia oraria
    unsigned long int powerOn_dfRic[numeroRicetteMax];          // orari di avvio in modalità temporizzata
    unsigned long int powerOff_dfRic[numeroRicetteMax];         // orari di spegnimento
    unsigned long int TOn_dfRic[numeroRicetteMax];              // orari di avvio in modalità temporizzata
    unsigned long int TOff_dfRic[numeroRicetteMax];             // orari di spegnimento
    
    // modalità start stop
    char selLivello_dfRic;                                      // numero ionizzatori attivi
    
    // tipo macchina
    unsigned char  tipoMacchina_dfRic;                          // 0 = versione expensive , 1 = versione cheap
    
    // linearizzazione pressostato
    char  P_max_dfRic;
    char  P_min_dfRic;
    long int V_max_dfRic;
    long int V_min_dfRic;
    
    // ore utilizzo
    long int oreLavorate1_Ric;
    long int oreLavorate2_Ric;
    long int oreLavorate3_Ric;
    long int oreSoglia1_Ric;
    long int oreSoglia2_Ric;
    long int oreSoglia3_Ric;
    long int oreMax1_Ric;
    long int oreMax2_Ric;
    long int oreMax3_Ric;
    
    // warnings
    unsigned char tensioneAria_warning_Enable_Ric;
    unsigned char alimentazioneIonizzatori_warning_Enable_Ric;
    unsigned char tensioneMinMax_warning_Enable_Ric;
    unsigned char sicurezzaPorta_warning_Enable_Ric;
    unsigned char presenzaAcquaSerbatoio_warning_Enable_Ric;
    unsigned char OnOffRemoto_warning_Enable_Ric;
    unsigned char presenzaAria_warning_Enable_Ric;

    unsigned char Giorno_dfRic[numeroRicetteMax][7];

    unsigned char superadmin_password_Ric[32];
    unsigned char manutentore_password_Ric[32];
} datifissiRic __attribute__ ((PACKET));

// dichiara una struttura dati dfRic
datifissiRic dfRic;

// dichiara il file che servirà nelle funzioni
FILE *fpRic;

// funzione di caricamento dati della prima serie di dati fissi
void carica_fissiRic(void)
{
      fpRic = fopen(pathProg, "r");            // apertura del file del percorso pathProg in modalità lettura
      
      if (fpRic == 0)                          // se fpRic == 0 --> l' operazione fopen non ha avuto successo
        reset_fissiRic();                      // resetta i dati con i valori di default

      fread(&dfRic, sizeof(dfRic), 1, fpRic);  // legge i valori dei dati in fpRic e li carica in dfRic
      fclose(fpRic);                           // chiude fpRic  
}  

// funzione di salvataggio dati relativo alla prima serie di dati che ritorna 1 se l'operazione viene completata con successo
// ritorna 0 se non ha successo
char salva_fissiRic(void)
{
    dfRic.first_time_df = 0xAAAA;    // condizione di primo avvio, servirà in start.c
    
    fpRic = fopen(pathProg,"w");     // apertura del file del percorso pathProg in modalità scrittura
      
    if (fpRic == 0)                  // se fpRic == 0 --> fopen non ha avuto successo
        return 0;
        
    fwrite(&dfRic, sizeof(dfRic), 1, fpRic);  // scrive i valori dei dati fissi da dfRic in fpRic
    fclose(fpRic);                            // chiude fpRic
    return 1;
} 

// funzione di reset relativa alla prima serie di dati
void reset_fissiRic(void)
{
    // i valori vengono resettati impostando i valori di default
    int i;
    for (i = 0 ; i < numeroRicetteMax ; i++) {
        dfRic.selLivelli_ric[i] = 1;
        dfRic.modaLavoro_ric[i] = 0;
        dfRic.powerTimerEnable_dfRic[i] = 0;
        dfRic.powerOn_dfRic[i] = 0;
        dfRic.powerOff_dfRic[i] = 0;
        dfRic.TOn_dfRic[i] = 0;
        dfRic.TOff_dfRic[i] = 0;
        int j;
        for (j = 0 ; j < 7 ; j++) {
            dfRic.Giorno_dfRic[i][j] = 0;
        }
    }

    dfRic.tipoLavoro_dfRic = 0;
    dfRic.livelloAperturaY2_dfRic = 5;
    dfRic.ritardoAperturaY2_dfRic = 5;
    dfRic.pressioneMinima_dfRic = 9;
    dfRic.pressioneMassima_dfRic = 15;
    dfRic.livelloChiusuraY2_dfRic = 60;
    dfRic.ritardoChiusuraY1Y3_dfRic = 20;
    dfRic.selLivello_dfRic = 1;
    dfRic.tipoMacchina_dfRic = 1;
    dfRic.P_max_dfRic = 100;
    dfRic.P_min_dfRic = 0;
    dfRic.V_max_dfRic = 5000;
    dfRic.V_min_dfRic = 1620;
    dfRic.oreLavorate1_Ric = 0;
    dfRic.oreLavorate2_Ric = 0;
    dfRic.oreLavorate3_Ric = 0;
    dfRic.oreSoglia1_Ric = 3500;
    dfRic.oreSoglia2_Ric = 3500;
    dfRic.oreSoglia3_Ric = 3500;
    dfRic.oreMax1_Ric = 4000;
    dfRic.oreMax2_Ric = 4000;
    dfRic.oreMax3_Ric = 4000;
    dfRic.tensioneAria_warning_Enable_Ric = 1;
    dfRic.alimentazioneIonizzatori_warning_Enable_Ric = 1;
    dfRic.tensioneMinMax_warning_Enable_Ric = 1;
    dfRic.sicurezzaPorta_warning_Enable_Ric = 1;
    dfRic.presenzaAcquaSerbatoio_warning_Enable_Ric = 1;
    dfRic.OnOffRemoto_warning_Enable_Ric = 1;
    dfRic.presenzaAria_warning_Enable_Ric = 1;
    
    snprintf(dfRic.superadmin_password_Ric, sizeof(dfRic.superadmin_password_Ric), "1018");
    snprintf(dfRic.manutentore_password_Ric, sizeof(dfRic.manutentore_password_Ric), "118");
    
    // salva i dati impostati con i valori di default
    salva_fissiRic();
}


// -----------------------
// gestione elenco allarmi
// -----------------------

#define allarmiMax 100

// tipo di struttura dati relativa alla seconda serie di dati fissi
typedef struct elencoAllarmi
{
    U16 first_time_df;          // condizione di primo avvio
    char theData_All[allarmiMax][11];
    char thetime_All[allarmiMax][9];
    char theday[allarmiMax];
    char type_All[allarmiMax];
} elencoAllarmi __attribute__ ((PACKET));

// dichiara una struttura dati dfAll
elencoAllarmi dfAll;

// dichiara il file che ci servirà nelle funzioni
FILE *fpAll;

// funzione di caricamento dati relativa alla seconda serie di dati
void carica_fissiAll(void)
{
      fpAll = fopen(pathAll, "r");

      if (fpAll == 0)
        reset_fissiAll();

      fread(&dfAll, sizeof(dfAll), 1, fpAll);
      fclose(fpAll);
}

// funzione di salvataggio relativa alla seconda serie di dati
char salva_fissiAll(void)
{
    dfAll.first_time_df = 0xAAAA;

    fpAll = fopen(pathAll,"w");

    if (fpAll == 0)
        return 0;

    fwrite(&dfAll, sizeof(dfAll), 1, fpAll);
    fclose(fpAll);
    return 1;
}

// funzione di reset realtiva alla seconda serie di dati
void reset_fissiAll(void)
{
    // imposta i valori di default
    int i;
    for (i = 0 ; i < allarmiMax ; i++) {
        snprintf(dfAll.theData_All[i], sizeof(dfAll.theData_All[0]), "%s",  "                    ");
        snprintf(dfAll.thetime_All[i], sizeof(dfAll.thetime_All[0]), "%s",  "                    ");
        dfAll.theday[i] = 8;
        dfAll.type_All[i] = 0;
    }
    
    // salva i dati impostati con i valori di default
    salva_fissiAll();
}

Nello start.c:

// Nello start.c sono presenti anche variabili e funzioni del progetto originale la cui
// dichiarazzione è stata omessa perchè non riguradante la gestione dei dati fissi

carica_fissiRic();                   // carica i dati fissi nella struttura dati
if (dfRic.first_time_df !=0xAAAA) {  // se è il primo ciclo di avvio
    sostituzioneAlimentatori = 0;
    num_lingua = 1;
    gestioneLingua();
    reset_fissiRic();                // imposta i valori di default
}

carica_fissiAll();                   // carica i dati fissi della seconda serie (allarmi)
if (dfAll.first_time_df !=0xAAAA) {  // se è il primo ciclo di avvio
    reset_fissiAll();                // imposta i valori di default
}