no, a scuola ho studiato il C, non il C++. poi sul C++ me la cavo perchè unisco le conoscenze di C e di java
Tu mi stai quindi dicendo che quando ad un array cerco di aggiungere un elemento, il compilatore prende e copia tutto l'array da un'altra parte se non può aggiungere l'elemento nello spazio occupato prima dall'array. Vedi che allora è come dico io, che alla fine non conviene gestire la memoria così?
non lo fa il compilatore. se tu crei un array di 100 elementi, tutta la ram necessaria viene occupata subito.
Se tu avessi un array di 100 elementi, poi aggiungi 1 variabile a caso, dopodiché vuoi aggiungere 1 elemento all'array, questo non ci starebbe e tutto l'array verrebbe copiato dopo la variabile che rompe le scatole nel mezzo.
esatto
In questo modo perdo 100 byte di memoria in un colpo.
non perdi la memoria, puoi usarla per altro.
Se poi tale memoria non la riadopero per altre cose, l'aggiunta di 1 solo elemento all'array è divenuta un'operazione altamente sconventiente.
per questo sono nate le liste. Aggiungerei anche il fatto che nel momento della copia, hai un array di 100 e uno di 101, quindi è molto facile che finisci la ram quando invece ne avresti ancora un pò da usare..
pensa alle stringhe, se non fossero array dinamici che casino sarebbero da usare
Avrei una domanda visto che parlavate qui di array dinamici...
ho una funzione sul mio arduino Yun:
Process uptime;
uptime.runShellCommand("cat /proc/uptime | cut -d. -f1");
while (uptime.available() > 0) {
c = uptime.read();
Serial.write(c);
}
Non riuscendo a compiere operazioni matematiche sul numero che ottenevo e che visualizzavo correttamente sul monitor seriale, all'inizio credevo fosse un problema del tipo di variabile (c come char, int, long...?) poi un utente mi ha illuminato facendomi notare che il "numero" che veniva memorizzato tramite la funzione veniva letto"carattere a carattere" e che quindi avrei dovuto trattarlo come un ARRAY da trasformarmi poi in un INT o LONG che sia...
Il nuovo problema è quindi, visto che il comando in linux mi restituisce il numero di secondi trascorsi dall'avvio della scheda, e che questo numero sarà composto sempre da più cifre... se dichiaro un array per leggere l'output, come faccio che devo dichiarare anche quanti caratteri deve avere l'array ? mi serve una sorta di array dimensionato ad ogni loop in base al numero di cifre che compongono i secondi restituiti da linux... E' una cosa possibile ?
Ci sono altri modi altrimenti per aggirare il problema ?
se fai un array di 10 celle, la prima cella avrà indice 0, ma l'ultima sarà la 9!
infatti il for si fa con il <, e non con il <=, esempio:
const sizeArray = 10;
char array[sizeArray];
for (int i=0; i < sizeArray ; i++){
//i da 0 a 9!
}
ma trovo INUTILE che tu passi da array di caratteri! puoi fare la confersione della cifra al volo, moltiplichi il totale per 10 (inizializzato a 0, quindi la prima volta resta 0), sommi al totale la cifra
unsigned long uptime = 0; //UNSIGNED! è importante!
Process uptime;
uptime.runShellCommand("cat /proc/uptime | cut -d. -f1");
while (uptime.available() > 0) {
c = uptime.read();
uptime *= 10;
uptime += c - '0'; //il carattere C non corrisponde al numero, ma al corrrispondente in tabella ascii (che è cifra+48). però '0' viene interpretato dal compilatore come "carattere 0" e viene quindi sostituito con 48. Essendo tutti i numeri successivi ('1' = 49, '2' = 50 etc.. vedi tabella ascii)la coversione è sempre valida.
}
se chiamo la variabile "uptime" come il processo mi da errore..
certo, non puoi avere collisione di nomi di variabili/oggetti con lo stesso nome, colpa mia
l'output restituito sono caratteri strani/quadratini illeggibili smiley-sad
stai usando la write() che scrive il valore binario (quindi il valore dei 4 byte), devi usare la print che converte il tuo long in un bellissimo array di char adatto agli umani
no, in teoria hai solo il numero, usa un println() per andare a capi in automatico ad ogni output.
OPPURE può essere che stai leggendo anche un carattere non numeriuco, come uno spazio o un a capo. effettua le operazioni di moltiplicazione e somma solo se il carattere letto è '0' <= c <= '9'
if (c >= '0' && c <='9'){
//carateerere numerico
}else{
//carattere invalido
}
Perdonatemi... Qui avevo iniziato a chiedere solo x la storia dell' array dinamico... Poi sono andato fuori topic... Scusate ancora e grazie per i preziosi aiuti