riguardo le dimensioni...

Ciao, per spiegare le dimensioni dei vari tipi di variabili ho fatto uno sketch d’esempio e tirato fuori i valori compilati.
c’è un risultato che non so spiegare:
lo sketch:

'type' prova[100];

void setup() {
  for (int i = 0; i < 100; i++) prova[i] = i;
}

void loop() {
}

i risultati:
flash - ram - type

476 - 109 - bool e boolean

464 - 109 - byte

470 - 209 - int

484 - 409 - long

628 - 409 - float e double

La domanda è perchè c’è differenza nella flash tra l’uso di byte e bool? addirittura il byte occupa meno… pensavo fossero uguali!

dab77: La domanda è perchè c'è differenza nella flash tra l'uso di byte e bool? addirittura il byte occupa meno... pensavo fossero uguali!

Perché byte e bool anche se occupano tutti e due un byte sono trattati in modo diverso dal codice, questo comporta l'uso di differenti istruzioni assembly con tutte le conseguenze del caso sull'occupazione della flash.

Non credo che siano trattati diversamente, credo che dab77 abbia qualche altro problema …

Il seguente programma che usa byte :

byte pippo[100];

void setup() {
  for (int i = 0; i < 100; i++) pippo[i] = i;
}

void loop() {}

da : Binary sketch size: 492 bytes (of a 28,672 byte maximum)

Lo stesso programma, usando boolean :

boolean pippo[100];

void setup() {
  for (int i = 0; i < 100; i++) pippo[i] = i;
}

void loop() {}

da : Binary sketch size: 492 bytes (of a 28,672 byte maximum)

… ovvero … esattamente gli stessi identici valori (IDE 1.0.6) e … mi sembra anche normale dato che, in Arduino.h, nel core, si ha la seguente definizione :

typedef uint8_t boolean;
typedef uint8_t byte;

… ovvero, sia byte che boolean sono sempre un uint8_t :smiley:

Guglielmo

riguardo le dimensioni...

Si dice in giro che le dimensioni non sono importanti :grin:

gpb01: ... ovvero ... esattamente gli stessi identici valori (IDE 1.0.6) e ... mi sembra anche normale dato che, in Arduino.h, nel core, si ha la seguente definizione :

Stesso tuo programma compilato con IDE 1.6.1

Byte ram 109 flash 656 bool ram 109 flash 668

Adesso come la mettiamo ? :D

Vado a verificare cosa combina la 1.6.x con i bool, se non mi ricordo male qualcosa era stato fatto di diverso rispetto alla semplice typedef che li dichiara entrambi come unsigned char.

pablos: Si dice in giro che le dimensioni non sono importanti :grin:

Se lo dice una donna è solo per mortificarti :grin:

Semplice ... hanno fatto questo :

typedef bool boolean;
typedef uint8_t byte;

... ovvero si sono andati a legare alla classe C++ _Bool ... semplicemente appesantendo il tutto ... ORRORE !!! :grin:

Guglielmo

Infatti nel IDE 1.6.x la toolchain è aggiornata e include la definizione dei bool del C++, nella vecchia toolchain erano solo simulati con la tydef pertanto potevano assumere qualunque valore e non solo 0 o 1 come previsto dal tipo boolean del C++.

In Arduino.h

typedef bool boolean;
typedef uint8_t byte;

In stdbool.h

/* Supporting <stdbool.h> in C++ is a GCC extension.  */
#define _Bool bool
#define bool bool
#define false false
#define true true

Pertanto si ritorna alla mia spiegazione, bool/boolean sebbene occupa un byte è trattato diversamente dal unsigned char/byte. :smiley:

gpb01: .. ovvero si sono andati a legare alla classe C++ _Bool ... semplicemente appesantendo il tutto ... ORRORE !!! :grin:

Ma il C++ è un orrore :grin:

astrobeed: Infatti nel IDE 1.6.x la toolchain è aggiornata e include la definizione dei bool del C++, nella vecchia toolchain erano solo simulati con la tydef pertanto potevano assumere qualunque valore e non solo 0 o 1 come previsto dal tipo boolean del C++

... e potevano aggiornare la toolchain senza fare 'sta stronxxxx ... visto che la typedef è a livello di core in Arduino.h :roll_eyes:

E da che mondo è mondo ... 0 == false, qualsiasi altra cosa == true :grinning:

Guglielmo

gpb01:
Non credo che siano trattati diversamente, credo che dab77 abbia qualche altro problema …

Il seguente programma che usa byte :

byte pippo[100];

void setup() {
  for (int i = 0; i < 100; i++) pippo[i] = i;
}

void loop() {}




da : Binary sketch size: 492 bytes (of a 28,672 byte maximum)

Lo stesso programma, usando **boolean** :



boolean pippo[100];

void setup() {
  for (int i = 0; i < 100; i++) pippo[i] = i;
}

void loop() {}




da : Binary sketch size: 492 bytes (of a 28,672 byte maximum)

... ovvero ... esattamente gli stessi identici valori (IDE 1.0.6) e ... **mi sembra anche normale** dato che, in Arduino.h, nel core, si ha la seguente definizione :



typedef uint8_t boolean;
typedef uint8_t byte;




... ovvero, sia byte che boolean sono sempre un **uint8_t** :D 

Guglielmo

Grazie per la prova! la cosa si fa interessante visto che ho utilizzato la 1.6.1 (ho dimenticato di dirlo…)

EDIT: ops, non avevo mica visto gli altri 6 messaggi scritti nel frattempo…

e potevano aggiornare la toolchain senza fare 'sta stronxxxx ... visto che la typedef è a livello di core in Arduino.h :roll_eyes:

Diciamo di si, però il bool C++ con gli oggetti utente assume un significato particolare, forse per questo motivo l'hanno incluso. Questo però è legato a avrlibc e non ad arduino che poi si è adattata. Quindi nel core ci sarà qualcosa di simile a: typedef bool boolean

Ciao.

il tipo bool è presente anche nel c con le stesse caratteristiche del c++.
Il tipo _Bool è stato creato per aumentare la stabilità e portabilità del codice.
In primis ora si può scrivere codice quale:

if ( true == var )

mentre prima non si poteva, o meglio non era uno standard e perciò quel frammento di codice non era sicuro e perciò bisognava scrivere

if ( true == !(!var) )

Lo standard prevede anche che la dimensione di tale tipo sia di un bit, questo è una grande caratteristica ad esempio per essere usato per i flags.
Infatti essendo o 0 o 1 si ha la certezza che

flags = bool_activate << 1;

funzioni sempre.
Non solo, ma il compilatore potrebbe ottimizzare una struttura unendo più bool in un unico byte

struct a{
    bool a;
    bool b;
}

su architetture a 8 bit potrebbe avere dimensioni di solo un byte anziché 2 e in una a 32 bit un 4 byte anziché 8.Questo però dipende dal compilatore che si sta usando.