[MontelLUG] Impossibilità di utilizzare variabili statiche o globali
Samuele
samuele.zanin a tiscali.it
Dom 10 Apr 2016 12:18:44 CEST
Il mio viscerale odio per il C è noto, purtroppo ogni tanto mi tocca
averci a che fare.
L'altro giorno, stavo tentando di fare una funzione di log su file di
dati. Un'unica funzione, con due parametri, il tipo di operazione
(apertura, chiusura, scrittura) ed un array di char con i dati da loggare.
Inizialmente il descrittore del file era dichiarato come variabile
statica. All'apertura del file, si pianta tutto.
Descrittore dichiarato come variabile locale funziona.
Mi turo il naso e lo dichiaro come variabile globale: blocco del
programma (d'altronde da quanto leggo, statiche e globali vengono
trattate allo stesso modo).
Mi rituro il naso e porconando, dichiaro il descrittore come variabile
locale nel main e la passo come parametro in tutte le funzioni dove mi
server. Funziona (Csytemd!!!).
Qualsiasi altro tipo di variabile globale che tento di dichiarare da lo
stesso comportamento (ho già un'altra serie di variabili globali già in
uso). Lo sò che non si devono usare, ma sono variabili tipo il buffer
della seriale, gli oggetti di gpio ecc.
Qualche spiegazione razionale del fenomeno?
Dopo un paio d'ore mi accorgo che comunque il programma si pianta
(interviene il watchdog).
Di solito questo succede quando la memoria va a puttane.
Peccato che senza la funzione di log, tutto vada bene.
Ipotizzo che sia la dimensione del file troppo grande, quindi al
raggiungimento delle 3000 righe di log, chiudo e apro un nuovo file.
Adesso il programma si pianta molto prima, quindi mi vien da dire che il
problema sia nella funzione di apertura del file (fileopen).
Ho provato in velocità qualche programma di analisi statica del codice,
ma non sono riuscito a farli andare.
Da un punto di vista della logica del programma, non ho problemi, tutto
è corretto, ma capire cosa fa il compilatore C £"$%£"$%£$%$"£!!! non è
alla mia portata.
Il programma è sviluppato su piattaforma mbed, ho 32 KB di ram, gli
altri 32 sono dedicati alla ethernet.
https://developer.mbed.org/handbook/Memory-Model
Qualsiasi consiglio è ben accetto.
Maggiori informazioni sulla lista
montellug