Salve a tutti,
ho due problemi legati alla dichiarazione delle variabili globali e locali che spiegherò in modo separato perchè uno è implementato in un normale progetto e l'altro all'interno della libreria.
PROBLEMA: Dichiarazione variabile locale una sola volta in una funzione (Void o Restituente)
Ho già trovato un post dove si citava tale argomento ed è uscito fuori l'istruzione "static" e pensavo mi avesse risolto il problema ma invece no.
Il problema noto, che alla fine dei conti è lo stesso per le dichiarazioni di variabili nelle librerie,
sono le VARIABILI IN ARRAY dove l'indice se non è costante ma modificabile tramite parametri mi genera errori di compilazione.
Per rendere le cose ancora più capibili scrivo un esempio:
void Funzione_1(byte Valore, byte Numero_Valori, byte Indice){
byte Valori[Numero_Valori];
Valori[Indice] = Valore;
Serial.write(Valori[Indice]);
}
PS: mi scuso dell'inutilità di tale funzione ma è a solo scopo dimostrativo.
Nella funzione soprastante essa genera un'array di byte tanti quanti impostati da un parametro che è sulla funzione stessa e poi si passa alla parte di codice funzionale dove l'array in base all'indice riceve il dato in ingresso che poi a sua volta viene inviato tramite seriale.
Il PROBLEMA sta nel fatto che la riga di codice "byte Valori[Numero_Valori];" viene eseguita ogni volta che viene richiamata la funzione e io desidero dichiararla una sola volta all'interno di quel blocco.
L'utilità che desidero sta nel fatto di poter usare funzioni come questa, senza dover dichiarare variabili globali specifiche in altri progetti ma semplicemente copiando ed incollando ed modificando i parametri in ingresso senza dovermi preoccuparmi del codice interno con l'IMPORTANZA che nel blocco le variabili dichiarate non perdano il loro valore perchè ho creato funzioni dove se la variabile funge da contatore deve memorizzare il valore sempre anche dopo molti richiami tenendo sempre conto che si trattino di array poichè se fosse una sola variabile potrei usare la funzione "static" ma con l'array modificabile da parametro non me lo compila.
Infine questo dubbio va anche nella creazione di librerie dove non trovo un modo di rendere un'array interno con l'indice modificabile dall'utente.
Ho cercato di capire bene la libreria dello ShiftRegister 74HC595 dove imposti il numero di integrati ed in automatico vengono generate il giusto numero di variabili richieste.
All'interno di tale libreria ho trovato la funzione "memset()", "sizeoff()" e "malloc()" e dai commenti è come se fossero tali istruzioni a generare la quantità di variabili voluta.
Allego il progetto dove viene usata la libreria per il 74hC595 così potete dare un'occhiata.
Spero che esista un modo per far si da generare la dimensione di un array all'interno di una libreria e dichiarare variabili locali una sola volta all'interno di funzioni (sempre con array).
PS: l'istruzione "static" l'ho già provata e non funziona con array ad indici dinamici modificabili, per lei deve essere tutto costante a meno che non esista un metodo apposito.
SCSR74HC595.zip (2.36 KB)