2016-03-18 4 views
-1

Моя программа работает в основном хорошо, пока я не решу, чтобы ввести значение сторожевого остановить программу, и она выводит сообщение об ошибке «Exception брошенным в 0x00B474AD в проекте 4.exe: 0xC0000005: Access. Нарушение письма расположение 0x00B52FF9Почему моя программа вылетает, когда я вводим значение часового?

If есть обработчик для этого исключения, программа может быть безопасно продолжена ». Я пытаюсь выяснить, что вызывает ошибку, может ли быть, что строка инициализирована на 0, так что это всегда верно?

здесь код

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

#include "C:\Users\barta\OneDrive\Documents\Visual Studio 2015\Projects\Project 4\Project 4\array.h" 

void displayPlane(char msg[], char[ROW][COL]); 
void getData(int &, char &); 

int main() 
{ 
    int row = 0; 
    char seat; 

    while (row != -1) 
    { 

     displayPlane("\tChesapeaake Airlines", layout); 
     cout << endl; 
     getData(row, seat); 
     cout << endl; 
     int COL = seat - 'A'; 
     if (layout[row - 1][COL] == 'X') 
     { 
      cout << "Sorry this seat is take" << endl; 
     } 
     else 
     { 
      layout[row - 1][COL] = 'X'; 
     } 

    } 

    cout << "Have a nice day! " << endl; 

    system("pause"); 
    return 0; 
} 
void displayPlane(char msg[] , char[ROW][COL]) 
{ 
    cout <<msg << endl; 
    for (int r = 0; r < ROW; r++) 
    { cout << endl; 
    cout << setw(4) << r + 1; 
     for (int c = 0; c < COL; c++) 
     { 
      cout << setw(4) << layout[r][c]; 
     } 
    } 
} 
void getData(int& row, char& seat) 
{ 

    cout << "Enter row <-1 to stop> "; 
    cin >> row; 
    cout << "Enter your prefered seat "; 
    cin >> seat; 
    seat = toupper(seat); 
} 

и здесь заголовочный файл

//arrays for airline problem 

const int ROW = 9; 
const int COL = 4; 
const int CTR = 3; 

//initial seats in the plane 
    char layout[ROW][COL] = { { 'A', 'B', 'C', 'D' }, 
          { 'A', 'B', 'C', 'D' }, 
          { 'A', 'B', 'C', 'D' }, 
          { 'A', 'B', 'C', 'D' }, 
          { 'A', 'B', 'C', 'D' }, 
          { 'A', 'B', 'C', 'D' }, 
          { 'A', 'B', 'C', 'D' }, 
          { 'A', 'B', 'C', 'D' }, 
          { 'A', 'B', 'C', 'D' }}; 

    int classCtr[CTR] = {0,0,0}; 

    string classes[] = {"First Class", "Business Class", "Coach"}; 

    double fare [] = {500, 300, 100}; 

ответ

1

Хотя вы определили -1, чтобы быть вашим дозорным значением, и вы даже добры ly напечатайте эту информацию:

cout << "Enter row <-1 to stop> "; 
cin >> row; 

Вы не сказали программе, что есть что-то особенное о -1.

Итак, строка теперь равна -1. Программа продолжается.

cout << "Enter your prefered seat "; 
cin >> seat; 
seat = toupper(seat); 

, а затем мы возвращаемся к главному. Опять же, вы не сказали программе беспокоиться о значении строки, которая равна -1. Итак, теперь вы выполняете:

cout << endl; 
    int COL = seat - 'A'; 
    if (layout[row - 1][COL] == 'X') 

Вопрос: Если row является -1, какой элемент layout вы доступ?

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

Первое:

void getData(int& row, char& seat) 
{ 
    cout << "Enter row <-1 to stop> "; 
    cin >> row; 
    if (row == -1) 
     return; 
    cout << "Enter your prefered seat "; 
    cin >> seat; 
    seat = toupper(seat); 
} 

во-вторых, в главной:

cout << endl; 
getData(row, seat); 
if (row == -1) 
    break; 
cout << endl; 
int COL = seat - 'A'; 

лично, я хотел бы изменить «GetData» возвращать логическое значение, указывающее, был ли данные выборки или нет, и предположим, что, когда он возвращается false пользователь вводил значение дозорного устройства - таким образом мне не нужно экспортировать знания о том, что находится вне функции.

bool getData(int& row, char& seat) 
{ 
    cout << "Enter row <-1 to stop> "; 
    cin >> row; 
    if (row == -1) 
     return false; 
    cout << "Enter your preferred seat "; 
    cin >> seat; 
    seat = toupper(seat); 
    return true; 
} 

и в главной:

cout << endl; 
if (getData(row, seat) == false) // or just if (!getData(row, seat)) 
    break; 
cout << endl; 
int COL = seat - 'A'; 

и изменить while петлю к

for (;;) // infinite loop 
{ 
    ... 
+0

Я понимаю вашу логику, но мой профессор хочет, чтобы функция была недействительной, так что idk, если это будет работать –

+0

Придерживайтесь первой половины ответа, то есть 'return;' после обнаружения часового устройства сразу после пользователя вводит его. – kfsone

+0

Спасибо, что этот трюк! В основном, я смотрел, что часть контрольной суммы не определяется –

0
getData(row, seat); 
cout << endl; 
int COL = seat - 'A'; 
if (layout[row - 1][COL] == 'X') 

При вводе -1, вы обращаетесь

layout[-2] 
+0

Итак я бы изменить 1- строку? –

+0

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

+0

Hmmmmm thats was ia stumped –

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