2013-03-14 48 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