2016-03-18 105 views
-1

我的程序运行基本正常,直到我决定输入标记值停止程序,并显示一个错误 “异常的项目4.exe在0x00B474AD抛出:0000005:访问冲突写入位置0x00B52FF9当我输入标记值时,为什么我的程序崩溃?

如果这个例外有一个处理程序,程序可以安全地继续。“ 我想弄清楚是什么导致这个错误,它可能是行被初始化为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作为你的哨点价值,你甚至善良请打印此信息:

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

您还没有告诉程序有什么特别的-1。

所以,行现在等于-1。该计划继续。

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

然后我们回到main。再次,你没有告诉程序担心行的值,即-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

坚持与答案的前半部分,即''返回;'在用户之后立即检测到哨兵输入它。 – 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

嗯,这是摔了跤 –

相关问题