Estaba leyendo un código utilizando enteros de longitud arbitraria utilizando el código de la biblioteca GNU Multi-Precision (GMP). El tipo para un entero MP es mpz_t
como se define en el archivo de encabezado gmp.h.Algunas preguntas sobre una matriz de instancia única en typedef
Pero tengo algunas preguntas sobre la definición de nivel inferior de este tipo de biblioteca definida mpz_t
. En el código de cabecera:
/* THIS IS FROM THE GNU MP LIBRARY gmp.h HEADER FILE */
typedef struct
{
/* SOME OTHER STUFF HERE */
} __mpz_struct;
typedef __mpz_struct mpz_t[1];
Primera pregunta: ¿Tiene el asociado con el [1]
__mpz_struct
? En otras palabras, ¿el typedef
define un tipo mpz_t
como una matriz __mpz_struct
con una aparición?
Segunda pregunta: ¿Por qué la matriz? (¿Y por qué solo una ocurrencia?) ¿Es este uno de esos struct hacks que he escuchado?
Tercera pregunta (quizás indirectamente con la segunda pregunta): La documentación GMP para la función mpz_init_set(mpz_t, unsigned long int)
dice utilizarlo como el paso por valor solo, aunque uno asumir que esta función podría estar modificando su contenido dentro de la llamada a la función (y, por lo tanto, necesitaría pasar por la referencia) sintaxis. Consulte a mi código:
/* FROM MY CODE */
mpz_t fact_val; /* declaration */
mpz_init_set_ui(fact_val, 1); /* Initialize fact_val */
¿La matriz de una sola ocurrencia permitir el paso por referencia automáticamente (debido a la ruptura de la semántica gama/puntero en C)? Admito libremente que estoy analizando demasiado esto, pero ciertamente me encantaría cualquier discusión sobre esto. ¡Gracias!
Curiosamente, el último elemento en la __mpz_struct es de hecho un puntero (a un mp_limb_t, que en sí mismo se escribe como unsigned long long int [what a mouthful!]). Eliminé los contenidos por el interés de la brevedad. – pr1268