O era fischia che ti passa?
vabbe' non importa.....
il tutto è per poter salvare e ricaricare delle variabili da e per memoria di massa
si tratta di un gruppo di funzioni e macro che vanno aggiunte alla mia libreria dei registri, questa qui:La mia seconda volta in C++
per "standardizzare" quello che avevo fatto un po' più "artigianalmente" qui:
leggere o non leggere.....
in effetti le ho riprese e revisionate da li
il tutto andrebbe inserito nella libreria di prima, lato metodi
stavolta vado a "rovescio", dato che per linearità di esposizione esce meglio così
cominciamo con due macro, serve passare pe una macro perchè solo con quelle è accessibile a compiletime il "nome" della variabile che intendiamo salvare
#include "nelson.h"
#define Salva(a) {Registro inifile("/file.ini"); inifile.salva(#a, a);}
#define Carica(a) {Registro inifile("/file.ini"); inifile.carica(#a, a , (void *) &a);}
la nelson.h contiene alcune funzioni ausiliarie che vedremo magari dopo, ma che ho già pubblicato in precedenza
come vedete la macro Salva istanzia una variabile di classe registro, e la usa per salvarci una coppia chiave, valore, che sono il "nome" della variabile grazie all'operatore di "stringificazione" # (che pessima traduzione, e come secondo parametro il valore "attuale" della variabile
ovvio che a fronte di una macro così semplice la funzione membro salva NON puo' essere una funzione normale, ma come minimo serve che abbia overload a seconda dei differenti tipi della variabile in salvataggio
eccola:
// funzioni aggiuntive per salvare variabili
template <typename T>
void salva(char * chiave, T valore)
{
Stringa(stringa, 25);
byte negativo = (valore < 0);
byte index = 0;
if (negativo)
{
valore = valore * -1;
}
while (valore)
{
if (stringa[index])
{
stringa[index++] = valore % 10 + '0';
}
valore = valore / 10;
}
if (negativo)
{
if (stringa[index])
{
stringa[index++] = '-';
}
}
stringa[index] = 0;
invertistringa(stringa);
aggiungi(chiave, stringa);
};
void salva(char * chiave, char * valore)
// versione che accetta stringhe
// un puro wrapper
{
aggiungi(chiave, valore);
}
void salva(char * chiave, double valore)
// versione che accetta double
{
Stringa(stringa, 25)
dtoexpo(valore, stringa);
aggiungi(chiave, stringa);
}
void salva(char * chiave, float valore)
// versione che accetta float
{
Stringa(stringa, 25)
dtoexpo(valore, stringa);
aggiungi(chiave, stringa);
}
come vedete ho usato un template per tutti i tipi interi
che crea una stringa di lunghezza sufficente, la riempie con le singole cifre a rovescio, inverte la stringa e la salva come coppia chiave:valore (ho usato questo metodo invece che altri piu' classici per poter gestire anche gli (unsigned) long long int, che arduino ha ma non puo' gestire in stampa
poi ho tre overload
uno per le variabili stringa, che non fa nulla, passa la cosa alla funzione membro già esistente, che usa già nativamente stringhe
uno per i float
e uno per i double
ne servono due perche altrimenti quello mancante passerebbe per il template, non per il casting a quello con overload
le funzioni dtoexpo() e invertistringa() e la macro Stringa() le ho già pubblicate in precedenza, casomai chiedete