Go Down

Topic: Ridimensionare array (Read 1 time) previous topic - next topic

carletto

Avrei bisogno di cambiare la dimensione di un array in esecuzione.

Esempio:

      byte mioarray[35]:
     
      mioArray ha 35 elementi.

      Come posso cambiare dimensione esempio in 20 elementi 
      e poi in altre dimensione?


Carletto.

     

lesto

se non sai cos'è un puntatore lascia stare  :smiley-mr-green:
altrimenti studiati i puntatori e la realloc. Non tentare di usare la realloc() senza conoscere i puntatori che sicuro fai solo casino. Tanto casino.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

carletto


se non sai cos'è un puntatore lascia stare  :smiley-mr-green:
altrimenti studiati i puntatori e la realloc. Non tentare di usare la realloc() senza conoscere i puntatori che sicuro fai solo casino. Tanto casino.

Uso i puntatori anche se non ho molta dimestichezza. Se posso fare altrimenti li evito.

Ho chiesto in lista perchè nel reference di Arduino non ho trovato nulla a riguardo.

Carletto

lesto

allora devi guardare come si usa free(), malloc() e realloc(), e occhio a non creare garbage.
E gli array SONO puntatori (sotto mentite spoglie), quindi no, non esiste un modo per farne a meno.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

PaoloP

Cerca con Google: array dinamico c

pablos

Potresti variare la sua dimensione se l'array lo dichiari all'interno della funzione e non pubblico

void funzione_A(){
  byte mioarray[35]; qui mi bastano 35
}

void funzione_B(){
  byte mioarray[15]; qui mi bastano 15
}

quando esci dalle funzioni quello spazio che hai occupato dentro la func viene riutilizzato per altro
no comment

pablos

#6
Jan 23, 2013, 03:26 pm Last Edit: Jan 23, 2013, 03:33 pm by pablos Reason: 1
Però mi interesserebbe approfondire il discorso malloc() e realloc()

Se io ho nello sketch
PROGMEM  prog_uint16_t charSet[]  = { 65, 32, 16, 10, 11};
si potrebbe modificare il contenuto di quell' array durante l'esecuzione del programma o almeno una sola volta nel setup per esempio?
Se io potessi prendere 20kb della flash e scriverla attraverso la lettura di un file su sd oltre ai 4 della eeprom sarebbe la soluzione a un sacco di problemi varrebbe per me la pena di starci su anche 2-3 mesi  :smiley-roll-sweat:
Sarebbe la stessa cosa che riscrivere lo sketch da remoto?

ciao
no comment

lesto

prova ma dubito, per il fatto che è PROGMEM.

per la eeprom il discorse è differente, salvi nella cella 0 e 1 il numero di elementi e poi crei un array di quelle dimensioni del tipo di dato che ti interessa e poi fai un puntatore a byte che punta all'indirizzo dell'array dichiarato, e ogni byte letto dalla eeeprom finisce nel puntatore byte, il quale poi incrementerà il suo indirizzo di 1, il tutto finchè indirizzo di partenza < indirizzo di partenza + sizeof(tipo di dato salvato)*numero elementi
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

pablos

Per la eeprom già la uso e sono a tappo :), quali argomenti dovrei studiare per manipolare la flash? ovviamente parlo di arduino

grazie ciao
no comment

astrobeed


Se io ho nello sketch
PROGMEM  prog_uint16_t charSet[]  = { 65, 32, 16, 10, 11};
si potrebbe modificare il contenuto di quell' array durante l'esecuzione del programma o almeno una sola volta nel setup per esempio?


Certo che puoi farlo, i 328 permettono di scrivere la flash da programma previa allocazione dello spazio da utilizzare.
Leggi qui e avrai la soluzione alla tua domanda.

lesto


previa allocazione dello spazio da utilizzare.


quindi lo spazio allocato non è dinamico ma fissato a tempo compilazione?
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed


quindi lo spazio allocato non è dinamico ma fissato a tempo compilazione?


La flash per forza di cose visto che normalmente ospita solo il programma, se non riservi prima lo spazio per le eventuali variabili poi c'è il reale rischio di andare a scrivere sul programma stesso.

lesto

infatti quello che immaginavo, magari esiste qualcosa per risalire alla flash utilizzabile ed auto allocarla come array di byte, così con un pò di magia dei puntatori si può usare tutta.. ma è roba assai complessa.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

pablos

#13
Jan 23, 2013, 06:09 pm Last Edit: Jan 23, 2013, 06:17 pm by pablos Reason: 1
Certo immaginavo che era come giocare al piccolo chirurgo, devo stare attento a rimenere nei limiti della Flash usata e fuori dalla Sram delle variabili, anche se la sram dovrebbe essere al di fuori dei 256k in un altra casa :)

Flash Memory 256 KB of which 8 KB used by bootloader
SRAM   8 KB
chissà quegli 8 kb dei bootlooader.... saranno all'inizio o in fondo? :)

Quote
c'è il reale rischio di andare a scrivere sul programma stesso.

Bhe si finchè scrivo sul programma, si schianta, ma resettando risolvo, ma se scrivo nel bootloader sono guai seri.

Però di solito la cella di memoria vuota restituisce in decimale il byte 255, in qualche modo dovrei riuscire a vedere quali celle sono impegnate.

Bho... io ci voglio provare  è una cosa più grande di me :D :D

Grazie astro interessante quel link, forse fa al caso mio



no comment

lesto

Quote
Però di solito la cella di memoria vuota restituisce in decimale il byte 255, in qualche modo dovrei riuscire a vedere quali celle sono impegnate.


da quando questo? a me non risulta, anzi ci sarà dentro l'ultimo valore memorizzato... esattamente come in una variabile non inizializzata!

lòa parte boot-loader CREDO sia protetta, ma magari mi sbaglio. mi pare che il bootloader sia più in fondo, poi schiacciato sul fondo il programma, poi schiacciati all'inizio i vettori di interrupt... ma non sono assolutamente sicuro, anzi! forse astro lo sà, altrimenti guardando vecchie discussioni si è parlato relativamente spesso di queste cose
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up