2014-01-13 2 views
-1

Я использую Visual Studio для Windows для программирования, и мой код работает нормально, но при запуске на Ubuntu я получаю сообщение «Проблема с сегментацией (core dumped)», и я Не знаю, что это вызывает. Я понятия не имею, где в коде проблема, поэтому я вложил все это. Заранее спасибо!Окно проблем с сегментацией (Core Dumped) для Linux

#include "Person.h" 
#include "Grade.h" 

using std::ifstream; 
using std::ofstream; 
using std::cout; 
using std::cin; 
using std::endl; 
using std::vector; 
using std::stringstream; 
using std::fixed; 
using std::setprecision; 
using std::setfill; 

unsigned z = 0; 
unsigned y = 0; 

void firstInput(vector<Person>& peoples, char *argv[]) 
{ 
int x = 0; 
string idy, namey, addressy, phoney, s; 

ifstream one; 
one.open(argv[1]); 

while (getline(one, s)) 
{ 
    if (x == 0) 
    { 
     idy = s; 
    } 

    if (x == 1) 
    { 
     namey = s; 
    } 

    if (x == 2) 
    { 
     addressy = s; 
    } 

    if (x == 3) 
    { 
     phoney = s; 
     Person *f1 = new Person(idy, namey, addressy, phoney); 
     peoples.push_back(*f1); 
     x = -1; 
    } 

    x++; 

} 

one.close(); 
} 

void secondInput(vector<Grade>& gradies, char *argv[]) 
{ 
int b; 
string z, idy2, gradey, classy; 

ifstream two; 
two.open(argv[2]); 

b = 0; 

while (getline(two, z)) 
{ 
    if (b == 0) 
    { 
     classy = z; 
    } 

    if (b == 1) 
    { 
     idy2 = z; 
    } 

    if (b == 2) 
    { 
     gradey = z; 
     Grade *g1 = new Grade(classy, idy2, gradey); 
     gradies.push_back(*g1); 
     b = -1; 
    } 
    b++; 
} 

two.close(); 
} 

double scoreConverter(string lettergrade) 
{ 
double converted = 0.0; 

if (lettergrade.substr(0,1) == "A") 
{ 
    converted += 4; 
} 

if (lettergrade.substr(0,1) == "B") 
{ 
    converted += 3; 
} 

if (lettergrade.substr(0,1) == "C") 
{ 
    converted += 2; 
} 

if (lettergrade.substr(0,1) == "D") 
{ 
    converted += 1;; 
} 

if (lettergrade.size() > 1) 
{ 
    if (lettergrade.substr(1,2) == "-") 
    { 
     converted -= 0.3; 
    } 
    if (lettergrade.substr(1,2) == "+") 
    { 
     converted += 0.4; 
    } 
} 
return converted; 
} 

void computeGPA(vector<Grade>& s, vector<Person>& p, string IDnum) 
{ 
int count = 0; 
y = 0; 
double gpa = 0; 

    for (string x = IDnum; y < s.size(); y++) 
    { 
     if (x == s.at(y).getIDs()) 
     { 
     gpa += scoreConverter(s.at(y).getScore()); 
     count++; 
     } 
    } 
     if (gpa > 0) 
     { 
     gpa = gpa/count; 
     } 
     cout << IDnum << " "; 
     cout << fixed << setprecision(2) << setfill('0') << gpa << " "; 

    for (unsigned x = 0; x < p.size(); x++) 
    { 
     if (IDnum == p.at(x).getID()) 
     { 
      cout << p.at(x).getName() << endl; 
      x = 1000; 
     } 
    } 

    z = y; 
} 

void thirdInput(vector<Grade>& gradies, vector<Person>& persons, char *argv[]) 
{ 
string querying; 

ifstream three; 
three.open(argv[3]); 


while(getline(three, querying)) 
{ 
for (unsigned x = 0; x < persons.size(); x++) 
{ 
    if (querying == persons.at(x).getID()) 
    { 
     computeGPA(gradies, persons, persons.at(x).getID()); 
     x = 1000; 
    } 
} 
} 
} 

int main(int argc, char *argv[]) { 

ofstream outputit; 
outputit.open(argv[4]); 

std::ofstream out(argv[4]); 
std::cout.rdbuf(out.rdbuf()); 

vector<Person> people; 
vector<Grade> grades; 

firstInput(people, argv); 

std::sort(people.begin(), people.end()); 

    for (unsigned x = 0; x < people.size(); x++) 
    { 
     cout << people.at(x).getName() << endl; 
     cout << people.at(x).getID() << endl; 
     cout << people.at(x).getPhone() << endl; 
     cout << people.at(x).getAddress() << endl; 
    } 

    cout << endl; 

secondInput(grades, argv); 

std::sort(grades.begin(), grades.end()); 

for (unsigned x = 0; x < grades.size(); x++) 
{ 
    cout << grades.at(x).getIDs() << " "; 
    cout << grades.at(x).getScore() << " "; 
    cout << grades.at(x).getClass() << endl; 
} 

cout << endl; 

thirdInput(grades, people, argv); 

outputit.close(); 
} 
+0

Как определяются «Личность» и «Оценка»? – Joe

+1

Вы можете понять, где он разбился, основываясь на том, что он напечатал, прежде чем он сработает. Если он ничего не напечатал перед сбоем, добавьте выходные инструкции, пока не получите какой-либо результат. – Gabe

+0

Как и «где он падает», было бы полезно узнать, какие данные вы предоставляете до того, как он сработает. –

ответ

1

Для того, чтобы выяснить, где ошибка сегментации происходит вы можете использовать gdb.

Скомпилируйте свою программу с помощью -ggdb, предполагая, что вы используете GCC.

Запустите программу с помощью следующей команды:

gdb myprog myinputs.txt 

Попав gdb строке введите run. После сбоя сегментации процесса вы должны вернуться к приглашению gdb. Оттуда вы можете ввести bt, чтобы получить обратную трассировку.

Это должно дать вам достаточно информации для расследования вашей ошибки.

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

  • Нет связанных вопросов^_^