1

Project Euler Problem 21を解決する小さなプログラムを書いていて、コードの初期部分をテストしていると、原因不明の内部コンパイラ エラーが発生しました。この種のエラーを回避するためにプログラムを書き直す方法についてのヒントをいただければ幸いです。

ビルド コマンドとコンパイラ オプションは次のとおりです。

g++ -std=c++11 -O2 -Wall -o "pe_021" "pe_021.cc"

これが私が得るエラーです:

Internal compiler error: Error reporting routines re-entered.  
Compilation failed.

これが私のコードです:

#include <array>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

const unsigned int N = 10000; //look for amicable numbers smaller than N
vector<unsigned int> list_of_primes;

vector<unsigned int[2]> prime_factorize(unsigned int);

int main(int argc, char **argv)
{
    //import a list of primes
    ifstream ifs ("primes_10000.txt");
    for (unsigned int index = 0; index < N; index++) {
        string prime_number;
        getline(ifs, prime_number);
        list_of_primes.push_back(stoi(prime_number));
    }
    ifs.close();

    //test prime factorization function by prime factorizing 12
    vector<unsigned int[2]> prime_factorization = prime_factorize(12);
    for(unsigned int (&prime_and_exponent)[2] : prime_factorization) {
        cout << prime_and_exponent[0] << ", " << prime_and_exponent[1] << endl;
    }

    return 0;
}

vector<unsigned int[2]> prime_factorize(unsigned int number)
{
    vector<unsigned int[2]> prime_factorization;
    for(unsigned int index = 1; index < list_of_primes.size(); index++) {
        if(number % list_of_primes[index] == 0) {
            unsigned int prime_and_exponent[2] = {list_of_primes[index], 1};
            prime_factorization.push_back(prime_and_exponent);
            number /= list_of_primes[index];

            while(number % list_of_primes[index] == 0) {
                prime_factorization.back()[1]++;
                number /= list_of_primes[index];
            }
        }
        if(number == 1) {
            break;
        }
    }
    return prime_factorization;
}
4

2 に答える 2

3

エラーは行によって引き起こされます

  prime_factorization.push_back(prime_and_exponent);

配列をベクトルに入れると、少なくとも GCC 4.7.3 ではクラッシュするようです。まず、GCC 開発者にバグ レポートを送信します。次に、unsigned int[2]クラスにラップします。これでうまくいくと思います。

UPD: コメントで指摘されているように、配列をベクターに入れることは違法です。

于 2013-09-01T20:32:28.140 に答える