realloc() sembra non funzionare

Buongiorno a tutti. Sono nuovo nel forum quindi chiedo scusa in anticipo se ho sbagliato sezione in cui postare. Passo ad esporvi il mio problema.

All'interno del mio programmino che sto caricando su un Arduino UNO (della Sintron) ho scritto questo codice (non pubblico tutto il codice perché è lunghetto!):

do{
	code_input = realloc(code_input, i+1);
	code_input[i] = knock_time(PLAY);
	code_input[i] += knock_time(REST);
        i++;
	lcd.print(sizeof(code_input));
}while(code_input[i] < max_time);

dove code_input è un puntatore di tipo byte inizializzato con malloc(1), knock_time è una funzione che ritorna byte, max_time è un semplice int e i è inizializzata a 0. knock_time() calcola semplicemente quanto tempo passa tra due pressioni successive di un pushbutton, quindi ad ogni pressione i si dovrebbe incrementare di uno e così anche la dimensione dell'array code_input.

Il problema è che ad ogni pressione del bottone la dimensione che stampa lcd.print è sempre 2. Qualcuno può aiutarmi a capire dove sta il problema?

Perché sizeof non ritorna la dimensione di qualcosa di allocato, non esiste nessuna funzione C/C++ che lo faccia, devi tenerne traccia tu. Ti ritorna 2 perché code_input è un puntatore e su Arduino i puntatori occupano appunto 2 byte.

Detto questo, dimentica l'allocazione dinamica quando lavori su microcontrollori ridotti ai minimi termini come il 328 di Arduino, quindi ripensa l'intero sketch allocando tutto staticamente. Hai solo 2 KB di RAM e allocazioni e deallocazioni ripetute portano rapidamente alla frammentazione col risultato che avrai un sacco di RAM teoricamente libera ma inutilizzabile.

>militandri: Come ti ha già detto SukkoPera ... NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare l'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!! :smiling_imp:

Quindi ... evita ... :smiley:

Guglielmo

Grazie mille, adesso è chiaro.
Per quanto riguarda il problema dell'allocazione pensavo di limitarlo ponendo un limite massimo per la realloc. Purtroppo per questa applicazione è quasi indispensabile diaporre di un array dinamico. Può essere una soluzione (calcolando che comunque in qualsiasi caso l'array puntato da code_input non supererebbe mai i 20-25 indici!) liberare con free() la memoria occupata da code_input? O la RAM resterebbe comunque frammentata?

Dipende da come è realizzato l'allocatore, ma essendo del tutto al di fuori del tuo/nostro controllo è qualcosa di cui non ci si può fidare. Ci sono norme riguardo ai programmi per microcontroller che non solo sconsigliano l'uso della memoria dinamica, ma lo vietano categoricamente (idem per la ricorsione). Quindi devi valutare tu se per la specifica applicazione è grave o meno che ogni tanto random il sistema si pianti.

Ok tutto chiaro. Grazie mille!

militandri:
Purtroppo per questa applicazione è quasi indispensabile diaporre di un array dinamico.

Ci credo poco. Se ci pensi, l'allocazione dinamica ha senso su un sistema multitasking, dove ora la RAM può servire ad un applicativo, e dopo ad un altro. Su un microcontrollore con un unico programma in esecuzione, perché non allocare fin da subito staticamente il numero massimo di oggetti che decidi di supportare? Intanto se non la usa lui, la RAM mica la usa nessun altro.