2014-12-08 3 views
0

Я получаю эту неприятную ошибку при компиляции программы на C++. Я посмотрел и не нашел ответа. Это странно, потому что мой код действительно базовый и не должен вызывать никаких проблем, но он все же ... Я использую Ubuntu и CODEBLOCKS IDE для работы. Вот полный код:Ошибка сегментации (ядро сбрасывается) в C++

#include <iostream> 
#include <iomanip> 
using namespace std; 

struct database 
{ 
string number; 
string spec_number; 
char group; 
float grade; 
string name; 
string family_name; 
}; 

void FillDatabase(database student[], short N,short &i); 
void SplitDatabase(database student[], short N,short i); 




int main() 
{ 
short number_of_students,iteration=0; 

//ПРОВЕРКА: 
cout << "Za kolko studenta shte vyvejdate? "; 
cin >> number_of_students; 
cin.ignore(); 

database student[number_of_students]; 

FillDatabase(student,number_of_students,iteration); 



//МЕНЮ ЗА ИЗБОР 
SplitDatabase(student, number_of_students,iteration); 


return 0; 
} 

//-------------------------------------------------------------------------------------------------------------------------------------------- 

void FillDatabase(database student[], short N,short &i) 
{ 
for(i=0;i < N;i++) 
{ 
//ДОПЪЛНИТЕЛНИ ПРОВЕРКИ ЗА ВАЛИДНОСТ: 
cout << endl << endl << "VIE VYVEJDATE ZA STUDENT NOMER " << i+1 << "." << endl; 
cout << endl << "Vyvedete fakulteten nomer na studenta..."; 
cin >> student[i].number; 
cout << endl << "Vyvedete kod na specialnostta 52(E) ili 61(AIUT)..."; 
cin >> student[i].spec_number; 
cout << endl << "Vyvedete grupa na studenta..."; 
cin >> student[i].group; 
cout << endl << "Vyvedete sreden uspeh ot semestyra..."; 
cin >> student[i].grade; 
cout << endl << "Vyvedete ime na studenta..."; 
cin >> student[i].name; 
cout << endl << "Vyvedete familiya na studenta..."; 
cin >> student[i].family_name; 
cin.ignore(); 
} 

} 

void SplitDatabase(database student[], short N,short i) 
{ 
short count_of_E(0); 
for(i=0;i < N;i++)if(student[i].spec_number=="52")count_of_E++; 

database E_student[count_of_E]; 
database AIUT_student[N-count_of_E]; 

for(i=0;i < N;i++) 
{ 
if(student[i].spec_number=="52") 
{ 
E_student[i].number = student[i].number; 
E_student[i].spec_number = student[i].spec_number; 
E_student[i].group = student[i].group; 
E_student[i].grade = student[i].grade; 
E_student[i].name = student[i].name; 
E_student[i].family_name = student[i].family_name; 
} 
else 
{ 
AIUT_student[i].number = student[i].number; 
AIUT_student[i].spec_number = student[i].spec_number; 
AIUT_student[i].group = student[i].group; 
AIUT_student[i].grade = student[i].grade; 
AIUT_student[i].name = student[i].name; 
AIUT_student[i].family_name = student[i].family_name; 
} 

} 

cout << endl << endl << endl << left << "E" << setw(50) << right << "AIUT" << endl << endl; 

for(i=0;i < N;i++) 
{ 
cout << left << E_student[i].name << endl; 
cout << left << E_student[i].family_name << endl; 
cout << left << E_student[i].number << endl; 
cout << left << E_student[i].group << endl; 
cout << left << E_student[i].grade << endl << endl; 

cout << setw(50) << right << AIUT_student[i].name << endl; 
cout << setw(50) << right << AIUT_student[i].family_name << endl; 
cout << setw(50) << right << AIUT_student[i].number << endl; 
cout << setw(50) << right << AIUT_student[i].group << endl; 
cout << setw(50) << right << AIUT_student[i].grade << endl; 
} 

} 

/* 
string number; 
string spec_number; 
char group; 
float grade; 
string name; 
string family_name; 



61462166 52 2 5.50 
*/ 

Я надеюсь, что кто-то придает мне руку здесь, я разочарован ....

+1

Куда он падает? Удалите код, пока он больше не выйдет из строя. На этом этапе последний бит кода, который вы удалили, скорее всего, станет причиной сбоя. Затем отправьте сообщение об устранении неполадок (см. Также: [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve)) – RandomSeed

+0

У вас действительно есть проблемы с компиляцией кода (как ваш вопрос, кажется, говорит), или вы получаете SegFault при запуске скомпилированного исполняемого файла? Если первый, то компилятор получает SegFault? –

+0

FYI: 'database student [number_of_students];' нестандартный C++, когда 'number_of_students' не является постоянным выражением. – crashmstr

ответ

0

Проблема (когда работает, не компиляции) в строках как эти:

E_student[i].number = student[i].number; 
E_student[i].spec_number = student[i].spec_number; 

//... 

AIUT_student[i].number = student[i].number; 
AIUT_student[i].spec_number = student[i].spec_number; 

Вы зацикливание над student от 0..N-1 - однако E_student и AIUT_student меньше N. Если N == 4 и E_student и AIUT_student оба размера 2, последний раз через цикл, который вы назначаете AIUT_student[3] или E_student[3] - мимо конца соответствующих массивов.

Вы должны иметь отдельные показатели для каждого массива:

int ei = 0, ai = 0; 

for (i = 0; i < N; i++) 
{ 
    if (student[i].spec_number == "52") 
    { 
    E_student[ei].number = student[i].number; 
    E_student[ei].spec_number = student[i].spec_number; 
    E_student[ei].group = student[i].group; 
    E_student[ei].grade = student[i].grade; 
    E_student[ei].name = student[i].name; 
    E_student[ei].family_name = student[i].family_name; 
    ++ei; 
    } 
    else 
    { 
    AIUT_student[ai].number = student[i].number; 
    AIUT_student[ai].spec_number = student[i].spec_number; 
    AIUT_student[ai].group = student[i].group; 
    AIUT_student[ai].grade = student[i].grade; 
    AIUT_student[ai].name = student[i].name; 
    AIUT_student[ai].family_name = student[i].family_name; 
    ++ai; 
    } 
} 
+0

Спасибо большое! Не работает безупречно. – Toshkuuu

0

вашей проблемы в том, что вы адресовать оба парциальные массивы AIUT_student и E_student с индексом всего массива студентов. это приведет к нарушению доступа, имеющему последнее значение в N/2 + 1

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