1

来源:

//$ 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.

笔记:

我在 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 的答案(已接受的答案)。

4

1 回答 1

4

对于如此大的向量(“堆栈溢出”),堆栈上根本没有足够的空间。您必须动态分配它:

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

Vec大小约为 6MiB。堆栈对于此类对象来说不够大。请注意,GMP 还提供了一个C++ 接口

于 2013-03-14T22:08:17.897 回答