2011-03-18 31 views
9

Me gustaría generar un número aleatorio o cadena utilizando el preprocesador C ... um ... Ni siquiera sé si esto es posible, pero estoy tratando de cree variables sobre la marcha (las cadenas serían útiles aquí) y asígneles valores (enteros). Así que hay algunas cosas que trato de hacer, pero la pregunta básica sigue siendo: ¿puedo crear una cadena o número aleatorio con el preprocesador?Generar un número aleatorio con el preprocesador C

+1

En resumen: no. Tendrá que escribir un preprocesador simple propio. No te olvides de diseñar una manera de probar tu código fuente aleatorio. –

+1

¿Has visto esto? http://www.ciphersbyritter.com/NEWS4/RANDC.HTM '1999-01-15 Jeff Stout' –

+5

¿Realmente necesita * al azar * o simplemente necesita * único *? Si este último, entonces tal vez use '__LINE__' para crear nombres únicos de variables? –

Respuesta

12

Respondo su pregunta de que desea tener una forma de crear tokens de identificador únicos a través del preprocesador.

gcc tiene una extensión que se llama __COUNTER__ y hace lo que espera de su nombre. Puede combinar esto con macro concatenación ## para obtener identificadores únicos.

Si tiene un compilador C99, puede usar P99. Tiene macros llamadas P99_LINEID y P99_FILEID. Se pueden usar como

#include "p99_id.h" 

P99_LINEID(some, other, tokens, to, make, it, unique, on, the, line) 

y similar para P99_FILEID.

El primero cambia el nombre de sus tokens y el número de línea y un hash que depende del número de veces que se ha incluido el archivo "p99_id.h". La segunda macro solo usa ese hash y no el número de línea, de modo que un nombre sea reproducible en varios lugares dentro de la misma unidad de compilación.

Estas dos macros también tienen contrapartes P99_LINENO y P99_FILENO que solo producen números grandes en lugar de tokens de identificador.

+0

¡Muy buena respuesta! – Xofo

+2

¿No es esa extensión '__COUNTER__'? https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html – Kupiakos

+1

@Kupiakos, tienes razón, gracias! –

-5

No hagas esto en C. Acabarás confundiendo a las personas. Si necesita crear variables sobre la marcha, use malloc y realloc y mantenga una matriz de sus valores.

Para responder a su pregunta, no. El preprocesador no incluye un generador de números aleatorios. Puede generar números aleatorios en tiempo de ejecución (con rand()), pero si realmente los necesita en tiempo de compilación, tendrá que escribir su propio preprocesador y ejecutar su código a través de él. O simplemente podría usar 4, que fue determinado al azar por un rollo de un dado justo de 100 caras.

15

Basado en 1999-01-15 Jeff Stout (gracias a @ rlb.usa)

#define UL unsigned long 
#define znew ((z=36969*(z&65535)+(z>>16))<<16) 
#define wnew ((w=18000*(w&65535)+(w>>16))&65535) 
#define MWC (znew+wnew) 
#define SHR3 (jsr=(jsr=(jsr=jsr^(jsr<<17))^(jsr>>13))^(jsr<<5)) 
#define CONG (jcong=69069*jcong+1234567) 
#define KISS ((MWC^CONG)+SHR3) 
/* Global static variables: 
    (the seed changes on every minute) */ 
static UL z=362436069*(int)__TIMESTAMP__, w=521288629*(int)__TIMESTAMP__, \ 
    jsr=123456789*(int)__TIMESTAMP__, jcong=380116160*(int)__TIMESTAMP__; 


int main(int argc, _TCHAR* argv[]){ 
    cout<<KISS<<endl; 
    cout<<KISS<<endl; 
    cout<<KISS<<endl; 
} 

Salida:

247524236 
3009541994 
1129205949 
+0

Muy buena implementación para un sistema integrado. Ambas respuestas son buenas. – Xofo

Cuestiones relacionadas