Ho mal di testa che induce problemi qui.Quando int non è un int (intX_t)
Fondamentalmente sto cercando di rendere una libreria compatibile con diversi sistemi Arduino (non una domanda Arduino).
Ho una situazione in cui i tipi non corrispondono più, poiché in un int
non è più equivalente al suo identico tipo di larghezza fissa. Nell'ambiente limitato fornito (senza stdlib e così via) ho scritto le mie classi di caratteri del tipo per le funzionalità di cui ho bisogno.
Tutto funziona correttamente tramite GCC 4.8.1 (avr) & Extensa-1x106-GCC (ESP8266), ma non in GCC 4.8.3 (SAM, core SAMD).
Fondamentalmente ho nocche verso il basso il mio codice per mostrare il problema in questo codice molto semplice (int
è confermato di avere 4 byte sui mancanza compilatori piattaforma a 32 bit):
template < typename T, typename U > struct is_same{ enum { value = false }; };
template < typename T > struct is_same< T, T > { enum { value = true }; };
void setup() {
static_assert(is_same<int,int32_t>::value, "Not integer");
}
void loop(){}
è possibile visualizzare un ' normale 'implementazione C++ qui (sopra è un'implementazione di base per l'uso all'interno dell'IDE di Arduino): http://cpp.sh/377e
A proposito, l'asser statico non si attiva neanche nel compilatore cpp.sh.
È 4.8.1 errato, ovvero int
e int32_t
devono essere considerati tipi diversi. O è 4.8.3 errato e dovrebbero essere equivalenti se uguali dimensioni definite dall'implementazione.
Stavo usando il codice qui sotto per rilevare qualsiasi tipo di numero intero, che era dove ho trovato il mio errore in origine.
template< typename T >
struct is_integer{
enum{
V8 = is_same< T, uint8_t >::value || is_same< T, int8_t >::value,
V16 = is_same< T, uint16_t >::value || is_same< T, int16_t >::value,
V32 = is_same< T, uint32_t >::value || is_same< T, int32_t >::value,
V64 = is_same< T, uint64_t >::value || is_same< T, int64_t >::value,
value = V8 || V16 || V32 || V64
};
};
io ovviamente può cambiare a verificare la presenza di char
, int
, long
, ecc .. ma sarà ancora bisogno di controllo per tutte le varianti a larghezza fissa e molto probabilmente le int_fastX_t
e int_leastX_t
tipi, che sembra un super metodo ridondante per garantire la massima usabilità.
Qualche idea?
Saluti, apprezzo qualsiasi input!
La toolchain in questione è disponibile da qualche parte? – melak47
puoi usare [boost] (http://www.boost.org/doc/libs/1_59_0/libs/integer/doc/html/boost_integer/traits.html) nel tuo ambiente embedded? –
@ melak47 Sì, è possibile scaricare [Arduino IDE] (https://www.arduino.cc/en/Main/Software) e dal menu Strumenti-> Scheda-> Gestione schede selezionare e installare il SAM, oppure Core SAMD per una delle catene in errore (farà il resto), quindi selezionare Zero (SAMD) o Due (SAM) dall'elenco Strumenti-> Scheda. (È un dolore, ma progettato per i principianti). Il core AVR 4.8.1 è fornito di default. –