2013-09-01 3 views
1

Я пишу небольшую программу для решения Project Euler Problem 21, и я тестировал ранние части моего кода, когда сталкивался с необъяснимой внутренней ошибкой компилятора. Я был бы признателен за любые советы о том, как перезаписать мою программу, чтобы избежать такой ошибки.g ++ Внутренняя ошибка компилятора в небольшой программе

Вот мои сборки команды и параметры компилятора:

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; 
} 
+0

попробуйте прокомментировать материал, пока он не будет работать. если вы не можете сначала попытаться обновить свой компилятор, тогда сделайте это. иначе мало что можно сделать здесь. – PlasmaHH

+0

Слишком много проблем, его немного сложно выколоть каждую ошибку. – P0W

ответ

3

Ошибка вызвана линии

prime_factorization.push_back(prime_and_exponent); 

Кажется, что перенос массивов в векторы приводит к сбою, по крайней мере, в GCC 4.7.3. Прежде всего, отправьте отчет об ошибках разработчикам GCC. Во-вторых, оберните свой unsigned int[2] в класс, я думаю, это должно сработать.

UPD: как указано в комментариях, помещение массива в вектор является незаконным.

+0

позволяет бросить std :: array в комнату. oh и не может работать, поскольку массивы не могут быть назначены. немного плохо из компилятора, чтобы выпустить ICE. – PlasmaHH

+0

@PlasmaHH Или ​​'std :: pair'. –

+3

@ Вдохновленный: это не ошибка, на первом месте. 'clang' корректно сообщает о нарушении ограничений:' error: object expression of non-scalar type 'unsigned int [2]' не может использоваться в выражении псевдо-деструктора' –

0

Заменены случаи использования unsigned int[2] с pair<unsigned int,int unsigned>. Вы будете намного счастливее.

Смежные вопросы