为什么当我输入标记值时我的程序会崩溃?
Why does my program crash when I enter sentinel value?
我的程序基本上运行良好,直到我决定输入标记值来停止程序,它显示错误
“项目 4.exe 中的 0x00B474AD 抛出异常:0xC0000005:访问冲突写入位置 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};
getData(row, seat);
cout << endl;
int COL = seat - 'A';
if (layout[row - 1][COL] == 'X')
如果您输入 -1,则您正在访问
layout[-2]
尽管您已将 -1 确定为您的标记值并且您甚至友好地打印了此信息:
cout << "Enter row <-1 to stop> ";
cin >> row;
你还没有告诉程序-1有什么特别之处。
因此,行现在等于 -1。节目继续。
cout << "Enter your prefered seat ";
cin >> seat;
seat = toupper(seat);
然后我们 return 到 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" 更改为 return 一个指示是否已获取数据的布尔值,并假设当它 return 时 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
{
...
我的程序基本上运行良好,直到我决定输入标记值来停止程序,它显示错误 “项目 4.exe 中的 0x00B474AD 抛出异常:0xC0000005:访问冲突写入位置 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};
getData(row, seat);
cout << endl;
int COL = seat - 'A';
if (layout[row - 1][COL] == 'X')
如果您输入 -1,则您正在访问
layout[-2]
尽管您已将 -1 确定为您的标记值并且您甚至友好地打印了此信息:
cout << "Enter row <-1 to stop> ";
cin >> row;
你还没有告诉程序-1有什么特别之处。
因此,行现在等于 -1。节目继续。
cout << "Enter your prefered seat ";
cin >> seat;
seat = toupper(seat);
然后我们 return 到 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" 更改为 return 一个指示是否已获取数据的布尔值,并假设当它 return 时 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
{
...