2016-03-18 44 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

嗯,這是摔了跤 –

相關問題