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

  1. Ovviamente "no, non è possibile" è una risposta accettabile se è vero.
  2. 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).
  3. 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.
È stato utile?

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
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top