来源:
//$ 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。错误是堆栈溢出。我认为这是由第3个参数引起的。这是mpz_array_init的原型(prototype)/定义:
#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.
注意:
我在Windows 7 64位上使用mpir 3.1.1。
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;
该答案基于@Zeta的答案(已接受的答案)。
最佳答案
堆栈上没有足够的空间来存放这么大的 vector (“堆栈溢出”)。您必须动态分配它:
mpz_t * Vec = malloc(VEC_MAX_SIZE * sizeof(mpz_t));
Vec
的大小约为6MiB。堆栈不足以容纳此类对象。请注意,GMP还提供了C++ interface。关于c++ - C++ mpir:如何初始化mpz_t数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15420806/