Pregunta

Estoy escribiendo C para el PIC32MX, compilado con el compilador de Microchip PIC32 C (basado en GCC 3.4).

añadido La norma que sigo es GNU99 (C99 con extensiones de GNU, compilador bandera -std=gnu99)

Mi problema es el siguiente: Tengo algunos datos numéricos reprogramables que se almacenan ya sea en EEPROM o Flash en el programa del chip. Esto significa que cuando quiero guardar un flotador, que tengo que hacer algún tipo juegos de palabras:

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 también incluyen valores por defecto como una matriz de constantes de tiempo de compilación. Para valores (sin signo) enteros esto es trivial, sólo tiene que utilizar el literal entero. Para los flotadores, sin embargo, tengo que usar este snippet Python para convertirlos a su representación palabra para incluirlos en la matriz:

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

... y por lo que mi conjunto de valores por defecto tiene estos valores indescifrables como:

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

(Estas son las que toman la forma de X construcciones macro, pero eso no hace una diferencia en este caso.) Al comentar es agradable, pero hay una manera mejor? Es genial ser capaz de hacer algo como:

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

... pero estoy completamente perdido, y ni siquiera sé si tal cosa es posible.

Notas

  1. Es evidente que "no, no es posible" es una respuesta aceptable si es cierto.
  2. No me preocupa demasiado acerca de la portabilidad, por lo que el comportamiento definido aplicación está muy bien, un comportamiento indefinido no es (he BID Apéndice sentado frente a mí).
  3. En lo que concierne donde yo sé, esto tiene que ser una conversión tiempo de compilación, ya que es DEFAULTS en el ámbito global. Por favor, corríjanme si estoy equivocado acerca de esto.
¿Fue útil?

Solución

¿Se puede hacer de su gama DEFAULTS una serie de IntFloat lugar?

Si puede, y sus soportes compilador C99, entonces usted puede hacer esto:

const IntFloat DEFAULTS[] =
{
    { .intval = 0x00000001 }, // Some default integer value, 1
    { .floatval = 0.005 }, // Some default float value, 0.005
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top