Frage

Ich schreibe C für den PIC32MX, kompiliert mit dem PIC32 C -Compiler von Microchip (basierend auf GCC 3.4).

Hinzugefügt Der Standard, den ich folge, ist GNU99 (C99 mit GNU -Erweiterungen, Compiler -Flagge -std=gnu99)

Mein Problem ist Folgendes: Ich habe einige neu programmierbare numerische Daten, die entweder auf EEPROM oder im Programmblitz des Chips gespeichert sind. Dies bedeutet, dass ich, wenn ich einen Schwimmer speichern möchte, irgendeine Art Punning machen muss:

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);
}

Ich füge auch Standardwerte als Array von Kompilierungszeitkonstanten ein. Für (nicht signierte) Ganzzahlwerte ist dies trivial, ich benutze nur das Ganzzahl wörtliche. Für Floats muss ich dieses Python -Snippet verwenden, um sie in ihre Wortdarstellung umzuwandeln, um sie in das Array aufzunehmen:

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

... und so hat meine Auswahl an Standardwerten diese nicht entscheidenden Werte wie:

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

(Diese haben tatsächlich die Form von X Makro Konstrukte, aber das macht hier keinen Unterschied.) Das Kommentieren ist schön, aber gibt es einen besseren Weg? Es ist großartig, so etwas wie zu tun:

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

... aber ich bin völlig ratlos und ich weiß nicht einmal, ob so etwas möglich ist.

Anmerkungen

  1. Offensichtlich "Nein, es ist nicht möglich" ist eine akzeptable Antwort, wenn sie wahr ist.
  2. Ich bin nicht übermäßig besorgt über die Portabilität, daher ist das implementierte Verhalten in Ordnung, undefiniertes Verhalten ist nicht (ich habe den IDB -Anhang vor mir).
  3. So wie ich es auch bewusst bin, muss dies eine Kompilierungszeitumwandlung sein, da DEFAULTS ist im globalen Bereich. Bitte korrigieren Sie mich, wenn ich mich darüber irre.
War es hilfreich?

Lösung

Kannst du deine machen? DEFAULTS Array eine Reihe von IntFloat stattdessen?

Falls Sie können, und Ihr Compiler unterstützt C99, dann können Sie Folgendes tun:

const IntFloat DEFAULTS[] =
{
    { .intval = 0x00000001 }, // Some default integer value, 1
    { .floatval = 0.005 }, // Some default float value, 0.005
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top