GMP mpz_array_init是一个过时的函数 - 我们应该如何初始化mpz数组?

时间:2014-11-13 12:11:44

标签: c gmp

仅使用GNU MP Bignum Library几次,我有兴趣看到我以前分配/启动数组的方式现在已经过时了。来自Integer Special Functions

  

5.16特殊功能

     

本节中的功能用于各种特殊目的。最   应用程序将不需要它们。 - 功能: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.

这是我分配和初始化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);

这仍然有效,没有错误或警告,顺便说一下,但是现在这个函数被列为过时的,在C中使用GMP分配数组的正确方法是什么?

2 个答案:

答案 0 :(得分:8)

如果要预先分配内存,只需循环遍历数组元素并使用mpz_init2逐个初始化它们:

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

mpz_array_init的问题在于它永远不会释放分配的内存。如果您单独初始化元素,则可以在以后释放它们:

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

答案 1 :(得分:-1)

不同方法怎么样:

/*
http://scicomp.stackexchange.com/questions/3581/large-array-in-gmp
gcc a.c -lgmp
*/
#include <stdlib.h> // malloc
#include <stdio.h>
#include <gmp.h>

#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 string 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;
}

好吗?