0

私は現在、Project Euler の問題 #60 を解決するために取り組んでいます: http://projecteuler.net/problem=60 (念のため、私のロジックを試してみたい場合)。

問題は、コードをビルドして (エラーなしで完了する)、それを実行した後、実行中に使用していた IDE から "Thread 1: EXC_Bad_Access (Code=1, address=0x7fff55056148)" というエラー コードが表示されることです。 (IDEにはデバッガーが組み込まれていると思います)。より具体的には、エラーは「組み合わせ」関数内でのみ発生します。強調表示される行は、組み合わせ関数内の「//」コメント行で無効になります。したがって、現在、エラーの原因となっているすべての行がコメントとして無効になっているため、私のコードはエラーなしで実行されます。これらの行のいずれか、またはそれらの行の組み合わせをコメント解除すると、コードは上記と同じエラー コードになります。

実験からの個人的なコメント: 私が見つけたのは、ofstream または count と呼ばれる初期化した整数のいずれかと関係がある行がエラーを引き起こすということでした。ofstream のようなものは理にかなっていますが、ofstream に関連するすべてのコード行を無効にした後でも、突然整数カウントがエラーの作成を開始します。

どんな助けでも大歓迎です!私はまだ C++ の初心者です (約 2 ~ 3 週間前に始めました)。

#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;

/* double x = 2 , y = 2 , b = 3, s = 2; */
/* int z, c = 1, v = 3000; */

int AllPrimes[3000];
/* int AllCombos[2018257871250650][5]; */ // disabled this line for now.

//Used to be within Combinations; Moved here to circumvent "Bad Access" Error

int FindPrimes();
int TestforPrime(double y);
int Combinations();
int WriteArrayToFile(int *ArrayPointer,int ArrayLength, string FileName, char Append);

int main()
{
    cout<<FindPrimes();
    cout<<Combinations();
}

int Combinations() {
    int i1, i2, i3, i4, i5, /* ai */ bi, ci, di, ei;
    int ZeroPointBreaker=0;
//ofstream BufferFlushed ("/Users/Yash/Xcode/Projects/Project Euler Programs/Project Euler Problem 60 (Weird Prime Cocatenate Property Problem)/I:O Files/");
int count=0;
int Buffer[9000000][5];
for (i1=0; i1<2996; i1++) {
    count++;
    // cout<<"Index 1 Iteration: "<<i1<<" || Count Value: "<<count<<"\n";
    bi = i1 + 1;
    for (i2=bi; i2<2997; i2++) {
       count++;
      //  cout<<"Index 2 Iteration: "<<i2<<" || Count Value: "<<count<<"\n";
        ci = i2+ 1;
        for (i3=ci; i3<2998; i3++) {
            count++;
            di = i3 + 1;
            for (i4=di; i4<2999; i4++) {
                count++;
                ei = i4 + 1;
                for (i5=ei; i5<3000; i5++) {
                    count++;
                   // Buffer[count][0]=AllPrimes[i1];
                  //  Buffer[count][1]=AllPrimes[i2];
                  //  Buffer[count][2]=AllPrimes[i3];
                 //   Buffer[count][3]=AllPrimes[i4];
                 //   Buffer[count][4]=AllPrimes[i5];
                }
            }
        }
    //Flush Here
    //   count=0;
        /* for (int i=0; i<9000000; i++) {
            if (Buffer[i][1]==0) {ZeroPointBreaker=i; break;}
        } */
  //      for (int i=0; i<ZeroPointBreaker; i++) {
           // BufferFlushed<<Buffer[i][1]<<','<<Buffer[i][2]<<','<<Buffer[i][3]<<','<<Buffer[i][4]<<','<<Buffer[i][5]<<'\n';
       // }
    }
}
//End of Code Statements
    //BufferFlushed.close();
    return 0;
}

int FindPrimes() {
cout.precision(0);
AllPrimes[0]=2;
double b = 3, s = 2;
int z, c = 1, v = 3000;
        while ( c != v ) {
            z = TestforPrime(b);
            if ( z == 1 ) {
                AllPrimes[c]=b;
                c = c + 1;
                s = s + b;
                if ( c == v ) {
                    cout<<fixed<<" Prime="<<b<<" Count="<<c<<" "<<"Sum="<<s<<"\n";
                    int success = WriteArrayToFile(AllPrimes,3000,"/Users/Yash/Xcode/Projects/Project Euler Programs/Project Euler Problem 60 (Weird Prime Cocatenate Property Problem)/I:O Files/AllPrimes.txt",'n');
                    cout<<"\n Write Success (0=Successful): "<<success<<"\n";
                    if (success == 0) {return 0;}
                    else {return 1;}
                }
                else {

                };
            }
            else {

            };
            b = b + 2;
        }
}

int WriteArrayToFile(int *ArrayPointer,int ArrayLength, string FileName, char Append) {
if (Append == 'y') {
    ofstream OutputFile (FileName, ios::app);
        for ( unsigned long long i1=0 ; i1 < ArrayLength ; i1++) {
            OutputFile<<ArrayPointer[i1]<<"\n";
        }
        OutputFile.close();
        return 0;}
else if (Append == 'n') {
    ofstream OutputFile (FileName);
    for ( unsigned long long i1=0 ; i1 < ArrayLength ; i1++) {
        OutputFile<<ArrayPointer[i1]<<"\n";
        }
        OutputFile.close();
        return 0;}
}

int TestforPrime (double y) {
double x = 2;
while ( x <= y ) {
    if ( (( y / x ) - int( y / x )) == 0 ) {
        if ( y == x ) {
            return 1;
        }
        else {
            return 0;
        }
    }
    x = x + 1;
}
}
4

1 に答える 1

0

この変数:

int Buffer[9000000][5];

45000000 * 4 バイトを占めます。それは180MBです。それをスタックに収めることはできません。グローバル変数または動的割り当てを使用します(または、おそらく別の解決策-問題自体を見ていないため、解決策が「正しい」かどうかわかりません)。

于 2013-06-09T08:53:03.300 に答える