momento della compilazione imballaggio galleggiante / giochi di parole
-
05-10-2019 - |
Domanda
Sto scrivendo C per il PIC32MX, compilato con PIC32 compilatore C di Microchip (basata su GCC 3.4).
Aggiunto Lo standard Sto seguendo è GNU99 (C99 con estensioni GNU, compilatore bandiera -std=gnu99
)
Il mio problema è questo: ho alcuni dati numerici riprogrammabili memorizzati sia su EEPROM o flash del programma del chip. Ciò significa che quando voglio conservare un galleggiante, devo fare un certo tipo giochi di parole:
typedef union
{
int intval;
float floatval;
} IntFloat;
unsigned int float_as_int(float fval)
{
IntFloat intf;
intf.floatval = fval;
return intf.intval;
}
// Stores an int of data in whatever storage we're using
void StoreInt(unsigned int data, unsigned int address);
void StoreFPVal(float data, unsigned int address)
{
StoreInt(float_as_int(data), address);
}
I includono anche i valori di default come un array di costanti di tempo di compilazione. Per valori (senza segno) integer questo è banale, mi basta usare il letterale intero. Per carri, però, devo usare questo Python snippet per convertirli alla loro rappresentazione di parola per includerli nella matrice:
import struct
hex(struct.unpack("I", struct.pack("f", float_value))[0])
... e così la mia scelta di default ha questi valori indecifrabili come:
const unsigned int DEFAULTS[] =
{
0x00000001, // Some default integer value, 1
0x3C83126F, // Some default float value, 0.005
}
(Questi effettivamente prendere la forma di X macro costrutti , ma questo non fa la differenza qui.) Commentando è bello, ma c'è un modo migliore? E 'bello essere in grado di fare qualcosa di simile:
const unsigned int DEFAULTS[] =
{
0x00000001, // Some default integer value, 1
COMPILE_TIME_CONVERT(0.005), // Some default float value, 0.005
}
... ma io sono totalmente in perdita, e io non so nemmeno se una cosa del genere è possibile.
Note
- Ovviamente "no, non è possibile" è una risposta accettabile se è vero.
- Non sto eccessivamente preoccupati per la portabilità, in modo implementazione comportamento definito va bene, un comportamento indefinito non è (ho la BIS Appendice seduto di fronte a me).
- Come fas come io sono a conoscenza, questo deve essere una conversione tempo di compilazione, in quanto
DEFAULTS
è in ambito globale. Si prega di correggermi se sbaglio su questo.
Soluzione
Si può fare l'array DEFAULTS
una serie di IntFloat
invece?
Se è possibile, e il proprio compilatore C99, allora si può fare questo:
const IntFloat DEFAULTS[] =
{
{ .intval = 0x00000001 }, // Some default integer value, 1
{ .floatval = 0.005 }, // Some default float value, 0.005
};