Я использую 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();
}
Как определяются «Личность» и «Оценка»? – Joe
Вы можете понять, где он разбился, основываясь на том, что он напечатал, прежде чем он сработает. Если он ничего не напечатал перед сбоем, добавьте выходные инструкции, пока не получите какой-либо результат. – Gabe
Как и «где он падает», было бы полезно узнать, какие данные вы предоставляете до того, как он сработает. –