Question

J'écris C pour le PIC32MX, compilé avec le compilateur C PIC32 de Microchip (basé sur GCC 3.4).

Ajouté La norme est que je suis GNU99 (C99 avec des extensions GNU, compilateur drapeau -std=gnu99)

Mon problème est le suivant: J'ai des données numériques reprogrammables qui sont stockées soit sur EEPROM ou dans le flash de programme de la puce. Cela signifie que quand je veux stocker un flotteur, je dois faire un certain type calembour:

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 comprennent également des valeurs par défaut comme un tableau de constantes de temps de compilation. Pour les valeurs entières (non signé), c'est trivial, je viens d'utiliser le littéral entier. Pour flotteurs, cependant, je dois utiliser Python extrait pour les convertir à leur représentation de mot pour les inclure dans le tableau:

import struct
hex(struct.unpack("I", struct.pack("f", float_value))[0])

... et donc mon tableau de valeurs par défaut a ces valeurs indéchiffrables comme:

const unsigned int DEFAULTS[] =
{
    0x00000001, // Some default integer value, 1
    0x3C83126F, // Some default float value, 0.005
}

(Celles-ci prennent effectivement la forme de X macro constructions , mais cela ne fait pas de différence ici.) Commentant est agréable, mais est-il une meilleure façon? Il est formidable de pouvoir faire quelque chose comme:

const unsigned int DEFAULTS[] =
{
    0x00000001, // Some default integer value, 1
    COMPILE_TIME_CONVERT(0.005), // Some default float value, 0.005
}

... mais je suis tout à fait à perte, et je ne sais même pas si une telle chose est possible.

Remarques

  1. Il est évident que « non, il est impossible » est une réponse acceptable si elle est vraie.
  2. Je ne suis pas trop préoccupé par la portabilité, de sorte que le comportement défini de mise en œuvre est très bien, le comportement non défini est pas (je la BID annexe assis devant moi).
  3. Comme fas que je sache, cela doit être une conversion de compilation, puisque DEFAULTS est dans la portée globale. S'il vous plaît me corriger si je me trompe à ce sujet.
Était-ce utile?

La solution

Pouvez-vous faire de votre tableau DEFAULTS un tableau de IntFloat à la place?

Si vous pouvez, et compilateur supporte C99, vous pouvez faire ceci:

const IntFloat DEFAULTS[] =
{
    { .intval = 0x00000001 }, // Some default integer value, 1
    { .floatval = 0.005 }, // Some default float value, 0.005
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top