ソース:
//$ 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 のプロトタイプ/定義は次のとおりです。
#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 の例からのこの 1 つは正常に動作します。
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 の回答 (受け入れられた回答) に基づいています。