2013-03-14 132 views
1

来源:C++ mpir:如何初始化mpz_t数组?

//$ DO DECLARATION 
#define VEC_MAX_SIZE 600000 
mpz_t Vec[ VEC_MAX_SIZE ]; 

//$ DO INITIALIZATION 
mpz_array_init(Vec[ 0 ], VEC_MAX_SIZE, 2000); // Stack overflow error - 3rd param 

问题:

的问题是,我不知道如何正确初始化mpz_t阵列,在这种情况下是VEC。错误是堆栈溢出。我认为这是由第三个参数引起的。这里是mpz_array_init的样机/定义:

#define mpz_array_init __gmpz_array_init 
__GMP_DECLSPEC void mpz_array_init __GMP_PROTO ((mpz_ptr, mp_size_t, mp_size_t)); 

错误:

Unhandled exception at 0x008e8377 in TestMPIR.exe: 0xC00000FD: Stack overflow. 

注:

我使用MPIR 3.1.1在Windows 7 64位。

这从一个MPIR的例子正常工作:

mpz_t Vec[ 20000 ]; 
mpz_array_init(Vec[ 0 ], 20000, 512); 

答:

感谢@Zeta他/她真棒答案。 纠正我,如果我错了。我只是想在这里发布这个,所以其他新手可以从中学习。

#define MAX_VEC_SIZE 600000 

的malloc方法(应该是对于C风格的我猜的):

mpz_t *Vec; 

if((Vec = (mpz_t *)::malloc(sizeof(mpz_t) * MAX_VEC_SIZE)) == 0) { 
    ::perror("Out of memory"); 
    return false; 
} 

//> Initialize Vec loop (...) 

::free(Vec); 

C++风格?

mpz_t *VecEx = new mpz_t[ MAX_VEC_SIZE ]; 

//> Initialize VecEx loop (...) 

delete [ ] VecEx; 

这个答案是基于@泽塔的回答(接受的答案)。

+0

你可以试试这个mpz_array_init(Vec,VEC_MAX_SIZE,sizeof(mpz_t)) – 2013-03-14 22:04:49

+0

完成,它给出了同样的错误。 – CLearner 2013-03-14 22:06:16

回答

4

栈上没有足够的空间来存放这样一个大的矢量(“堆栈溢出”)。您必须动态分配它:

mpz_t * Vec = malloc(VEC_MAX_SIZE * sizeof(mpz_t)); 

Vec大小约为6MiB。堆栈对于这些对象来说不够大。请注意,GMP还提供C++ interface

+0

错误:错误C2440:'初始化':无法从'void *'转换为'mpz_t(*)' 1>从'void *'转换为指向非'空白'的指针需要明确的转换 – CLearner 2013-03-14 22:16:08

+0

FWIW,推广[Boost.MultiPrecision](http://www.boost.org/libs/multiprecision/)作为GMP的首选C++前端。 – ildjarn 2013-03-14 22:17:02

+0

已解决的错误C2440:mpz_t * Vec =(mpz_t *):: malloc(sizeof(mpz_t)* VEC_MAX_SIZE); – CLearner 2013-03-14 22:44:30