GMPの大規模アレイ


8

mpz_t A [100000]という大きな配列を使用したい場合、コンパイル中に「セグメンテーション違反(コアダンプ)」が発生しました。これを解決する簡単な方法はありますか?


4
静的ではなく動的に割り当てようとしましたか?静的な割り当てはスタックに割り当てられ、動的な割り当てはヒープに割り当てられる場合があります。または、スタックサイズを変更して、問題が解決するかどうかを確認することもできます。どのシステムを使用しているかがわからなければ、その方法を説明することはできません。
tpg2114 2012年

回答:


6

tpg2114のコメントはスポットです。試してください:

/* at top */
#include <stdlib.h>

/* definition */
mpz_t *A;

/* initialization of A */
A = (mpz_t *) malloc(100000 * sizeof(mpz_t));
if (NULL == A) {
    printf("ERROR: Out of memory\n");
    return 1;
}

/* no longer need A */
free(A);

mallocここでの呼び出しでエラーが発生する場合は、システムに十分なメモリがありません。

スタックで静的配列を使用したい場合は、ulimitコマンドを使用してLinuxでスタック制限サイズを大きくしてみてください。


どうもありがとう。コンパイル中に、「組み込み関数 'malloc'の互換性のない暗黙の宣言[デフォルトで有効]」という警告が表示されました。ただし、機能します。
user12290 2012年

1
@ user12290すばらしい。stdlib.hを適切に含めるようにコードサンプルを修正した
Aron

1
この世界で善良なすべての愛を込めてfree(A)、その例にを入れてください!
Bill Barth

十分に公正、修正済み。
Aron Ahmadia

A配列の使用方法 私が試した場合:mpz_set_ui(A [4]、1212121); その後、メモリエラーが発生しました。
アダム

2

の代わりmpz_classにC ++(ref。)での使用を検討することもできmpz_tます。任意精度の演算を簡単にすることができます。

これはランダムな例です:

#include <gmp.h>
#include <gmpxx.h>
#include <iostream>
using namespace std;

int main() {
  mpz_class A[100000];
  for(int i=0;i<100000;i++) A[i]=142412+i;

  for(int i=0;i<100000;i++) cout << i << " " << A[i] << endl;

  return 0;
}

例:

g++ [[filename]] -lgmp -lgmpxx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.