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) を適切に初期化する方法がわからないことです。エラーはスタック オーバーフローです。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 の回答 (受け入れられた回答) に基づいています。

4

1 に答える 1

4

このような大きなベクトル(「スタックオーバーフロー」)のための十分なスペースがスタック上にないだけです。動的に割り当てる必要があります。

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

Vecサイズは約6MiBです。スタックは、そのようなオブジェクトには十分な大きさではありません。GMPはC++インターフェースも提供することに注意してください。

于 2013-03-14T22:08:17.897 に答える