GMP mpz_array_init est une fonction obsolète – Comment initialiser les tableaux mpz?

N’ayant utilisé que quelques fois la bibliothèque GNU MP Bignum , j’ai été intéressée de constater que la manière dont j’avais précédemment alloué / initié des tableaux est maintenant obsolète. À partir de fonctions spéciales entières :

5.16 Fonctions spéciales

Les fonctions de cette section servent à diverses fins spéciales. La plupart des applications n’en auront pas besoin. – Fonction: void mpz_array_init (mpz_t integer_array, mp_size_t array_size, mp_size_t fixed_num_bits)

This is an obsolete function. Do not use it. 

Voici comment je voudrais allouer et initialze un tableau de mpz_t .

 int array_size = 100; mpz_t *num_arr; num_arr = malloc(arr_size * sizeof(mpz_t)); mpz_array_init(*num_arr, array_size, 1024); 

Cela fonctionne toujours sans erreur ni avertissement, d’ailleurs, mais maintenant que cette fonction est listée comme obsolète, quelle est la bonne façon d’allouer un tableau utilisant GMP en C?

mpz_init2 simplement les éléments du tableau et initialisez-les un par un à l’aide de mpz_init2 si vous souhaitez préallouer de la mémoire:

 for (i = 0; i < array_size; i++) { mpz_init2(num_arr[i], 1024); } 

Le problème avec mpz_array_init est qu’il ne libérerait jamais la mémoire allouée. Si vous initialisez les éléments séparément, vous pouvez les libérer ensuite:

 for (i = 0; i < array_size; i++) { mpz_clear(num_arr[i]); } 

Qu’en est-il de la méthode différente:

 /* http://scicomp.stackexchange.com/questions/3581/large-array-in-gmp gcc ac -lgmp */ #include  // malloc #include  #include  #define LENGTH 100000 int main () { /* definition */ mpz_t *A; mpz_t temp; mpz_init(temp); /* initialization of A */ A = malloc(LENGTH * sizeof(mpz_t)); if (A==NULL) { printf("ERROR: Out of memory\n"); return 1; } // assign mpz_set_ui(temp, 121277777777777777); // using temp var mpz_set(A[4], temp); mpz_set_str(A[5], "19999999999999999999999999999999999999999999999999992",10); // using ssortingng if number > max // check gmp_printf ("%Zd\n",A[4]); // gmp_printf ("%Zd\n",A[5]); // /* no longer need A */ free(A); mpz_clear(temp); return 0; } 

Est-ce bien ?