2015-12-24 2 views
-1

Я работаю над проектом в C++, где запись различных игроков поддерживается в порядке точек они имеют scored.Here являются сегментами кодаGeneral Protection ошибка

1.Adding нового пользователя

void add_to_leader_board(user u) 
{ 
    fstream f("ldr brd.dat",ios::in|ios::binary); 
    fstream f2("temp.dat",ios::binary|ios::out); 
    user a; 
    int chk=0; 
    while(f.read((char*)&a,sizeof(user))) 
    { 
     if(a.getpts()<u.getpts()&&chk==0) 
     { 
      f2.write((char*)&u,sizeof(user)); 
      chk++; 
     } 
     f2.write((char*)&a,sizeof(user)); 
    } 
    f1.close(); 
    f2.close(); 
    remove("ldr brd.dat"); 
    rename("temp.dat","ldr brd.dat"); 
    dis_leader_board(u); 
    getch(); 
} 

2.Displaying записи

void dis_leader_board(user u) 
{ 
    clrscr(); 
    user a; 
    int i=0; 
    fstream f("ldr brd.dat",ios::in|ios::binary); 
    cout<<"Name"; 
    gotoxy(15,1); 
    cout<<"Points"; 
    while(f.read((char*)&a,sizeof(user))) 
    { 
     a.output(i); //The definition of this function has been written down 
    } 
    f.close(); 
} 

3. Изменение записей существующего пользователя и вставить в соответствующее положение (Письменное ДО, где проблема возникает)

void modify_leader_board(user u) 
{ 
    cout<<"Before saving "; 
    for(int i=0;i<5;i++) 
    { 
     delay(0,0,800); 
     cout<<". "; 
    } 
    delay(0,5); 
    clrscr(); 
    dis_leader_board(u); 
    delay(1,10); 
    . 
    .//Problem occurs before this.So I don't think the remaining is reqd 
    . 

4.Output функции

inline void user::output(int r) 
{ 
/* "name" and "pts" 
are data members*/ 
    r+=2; 
    gotoxy(1,r); 
    cout<<name; 
    gotoxy(15,r); 
    cout<<pts; 
} 

Когда я попытался выполнения программы, были следующие проблемы с которыми я столкнулся -

  1. Я вызвал функцию add_to_leader_board. Все прошло отлично. Имя было добавлено в файл. Я был очень счастливым. Но после отображения записей, вызвав dis_leader_board (который является частью add_to_leader_board), я получил сообщение, в котором говорилось об «Общей защите исключения».
  2. Я вызывал функцию edit_leader_board. Опять же, он работал отлично, пока не дошел до функции clrscr() перед вызовом dis_leader_board. Я был очень доволен ...... Но toozzz ... На этот раз даже , прежде чем он начал показывать записи, я получил сообщение с сообщением «General Protection Exception» !!!
  3. «Исключение общей защиты», «Исключение общей защиты», «Исключение общей защиты», «Исключение общей защиты» ..... Куда бы я ни пошел, кажется, следует за мной, как собака Хатч !!!

У меня такое чувство, что даже защита от меньшинства (независимо от того, требуется оно или нет), предложенная любым из правительств и организаций, не будет соответствовать защите, которую компилятор предлагает коду !!!!

Когда add_to_leader_board называется, исключение (General Protection Exception) происходит в f.close операторов() (возможно, что-то делать с ним быть последним оператором) в display_leader_board функции (вызывается add_to_leader_board) и когда modify_leader_board называется , это происходит даже до вызова функции display_leader_board

Может ли кто-нибудь помочь мне найти ошибку ??

Я также хочу знать все другие случаи, когда может возникнуть исключение общей защиты.

Я ценю ранний ответ.

Спасибо

+2

Ну, вы прошли через код в отладчике? Вы где-то переписываете какую-то память или имеете плохой указатель. – OldProgrammer

+2

Добро пожаловать в переполнение стека! Похоже, вам, возможно, потребуется научиться использовать отладчик для выполнения вашего кода. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+0

Что такое пользователь? Если это класс, вам нужно создать его в dis_leader_board(). – nicomp

ответ

2

Вы должны показать определение вашего user класса, чтобы быть уверенным, но я подозреваю, что этот класс содержит Непро- POD членов.

Таким образом, ваш подход к просто write и read экземпляров этих классов в файл, очевидно, не будет работать. Вы будете писать кучу необработанных значений указателя, и после их чтения эти значения необработанных указателей означают абсолютно ничего, и доступ к ним является наиболее вероятной причиной вашей «общей ошибки защиты».

Это лучшее, что можно определить из ограниченной информации, предоставленной в вашем вопросе.