4

私の教授は、私たちのプログラムで実行するテスト コードを送信します。ただし、テスト コード自体には、コンパイル時にセグメンテーション違反エラーがあります。エラーは最初のprintfで発生します。ただし、その行がコメントアウトされている場合は、次の行で発生します。コードは彼にとってはうまく機能しているように見えるので、なぜ失敗するのかを理解しようとしています. 私が C++ を使用しているときに彼が C を使用していることは知っていますが、g++ の代わりに gcc を使用してテスト コードをコンパイルしようとしても失敗します。なぜ私が問題を抱えているのか知っている人はいますか?ありがとう!コードは以下です。

#include <stdio.h>

main()
{  double A[400000][4],  b[400000], c[4] ;
   double result[4];
   int i, j; double s, t;
   printf("Preparing test: 4 variables, 400000 inequalities\n");
   A[0][0] = 1.0; A[0][1] = 2.0; A[0][2] = 1.0; A[0][3] = 0.0; b[0] = 10000.0;
   A[1][0] = 0.0; A[1][1] = 1.0; A[1][2] = 2.0; A[1][3] = 1.0; b[0] = 10000.0;
   A[2][0] = 1.0; A[2][1] = 0.0; A[2][2] = 1.0; A[2][3] = 3.0; b[0] = 10000.0;
   A[3][0] = 4.0; A[3][1] = 0.0; A[3][2] = 1.0; A[3][3] = 1.0; b[0] = 10000.0;
   c[0]=1.0; c[1]=1.0; c[2]=1.0; c[3]=1.0;
   for( i=4; i< 100000; i++ )
   {  A[i][0] = (12123*i)%104729; 
      A[i][1] = (47*i)%104729; 
      A[i][2] = (2011*i)%104729; 
      A[i][3] = (7919*i)%104729;
      b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 1 + (i%137);
   }
   A[100000][0] = 0.0; A[100000][1] = 6.0; A[100000][2] = 1.0; 
   A[100000][3] = 1.0; b[100000] = 19.0;
   for( i=100001; i< 200000; i++ )
   {  A[i][0] = (2323*i)%101111; 
      A[i][1] = (74*i)%101111; 
      A[i][2] = (2017*i)%101111; 
      A[i][3] = (7915*i)%101111;
      b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 2 + (i%89);
   }
   A[200000][0] = 5.0; A[200000][1] = 2.0; A[200000][2] = 0.0; 
   A[200000][3] = 1.0; b[200000] = 11.0;
   for( i=200001; i< 300000; i++ )
   {  A[i][0] = (23123*i)%100003; 
      A[i][1] = (47*i)%100003; 
      A[i][2] = (2011*i)%100003; 
      A[i][3] = (7919*i)%100003;
      b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 2 + (i%57);
   }
   A[300000][0] = 1.0; A[300000][1] = 2.0; A[300000][2] = 1.0; 
   A[300000][3] = 3.0; b[300000] = 20.0;
   A[300001][0] = 1.0; A[300001][1] = 0.0; A[300001][2] = 5.0; 
   A[300001][3] = 4.0; b[300001] = 32.0;
   A[300002][0] = 7.0; A[300002][1] = 1.0; A[300002][2] = 1.0; 
   A[300002][3] = 7.0; b[300002] = 40.0;
   for( i=300003; i< 400000; i++ )
   {  A[i][0] = (13*i)%103087; 
      A[i][1] = (99*i)%103087; 
      A[i][2] = (2012*i)%103087; 
      A[i][3] = (666*i)%103087;
      b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 1;
   }

   printf("Running test: 400000 inequalities, 4 variables\n");
   //j = rand_lp(40, &(A[0][0]), &(b[0]), &(c[0]), &(result[0]));
   printf("Test: extremal point (%f, %f, %f, %f) after %d recomputation steps\n", 
          result[0], result[1], result[2], result[3], j);
   printf("Answer should be (1,2,3,4)\n End Test\n");
}
4

2 に答える 2

18

変更してみてください:

double A[400000][4],  b[400000], c[4] ;

static double A[400000][4],  b[400000], c[4] ;

配列の宣言にAは自動保存期間があります。これは、おそらくシステム上でスタックに保存されることを意味します。プロセスの合計スタックはそれよりも低くなる可能性があり、スタック オーバーフローが発生しました。

ulimitLinux では、次のコマンドを実行できます。

$ ulimit -s
8192
$

プロセスに割り当てられた kB 単位のスタック サイズを確認します。たとえば、私のマシンでは 8192 kB です。

于 2012-05-07T21:07:09.063 に答える
12

スタックの限界を超えました。mainあなたの教授は、のスタック フレームで 15MB のデータを宣言しています。それは大きすぎます。

main の先頭で宣言されたオブジェクトの有効期間は基本的にプログラム全体であるため、オブジェクトを として宣言するだけstaticです。そうすれば、それらは (比較的無制限の) データ セグメントに含まれ、ほぼ同じ寿命になります。

この行を変更してみてください:

double A[400000][4],  b[400000], c[4] ;

これに:

static double A[400000][4],  b[400000], c[4] ;
于 2012-05-07T21:07:01.340 に答える