2

時,我不斷收到一個錯誤:在Gofish.exe 0x5a6fca58 (msvcr100d.dll)「訪問衝突」 錯誤運行C++程序

未處理的異常: 0000005:訪問衝突寫 位置0x0ff3b113。

,我試圖運行的代碼是:

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

class Card{ 
string suit; 
int rank; 
public: 
Card(int a, string b){ 
    rank=a; 
    suit=b; 
} 
Card(){} 
string getSuit(){ 
    return suit; 
} 
int getRank(){ 
    return rank; 
} 
}; 

class Deck{ 
Card deck [52]; 
public: 
Deck(){ 
    for(int i=1; i<=13; i++){ 
    deck [i]=Card(i, "spades"); 
    deck [i*2]=Card(i, "hearts"); 
    deck [i*3]=Card(i, "diamonds"); 
    deck [i*4]=Card(i, "clubs"); 
    } 
} 
    void list(){ 
    for(int i=1; i<=52; i++){ 
    cout << deck [i].getRank() << " of " << deck [i].getSuit() << endl; 
    } 
    } 
}; 

int main(){ 
Deck deck=Deck(); 
deck.list(); 
system("pause"); 
return 0; 
} 

我使用的編譯器是微軟的Visual C++ 2010速成如果,可能影響任何東西。

+1

代碼格式++? – Alex 2010-11-19 03:07:35

+5

顯然它編譯。如果沒有,則不會有'Gofish.exe'。 – strager 2010-11-19 03:09:51

+1

如果您正在訪問違規,那麼代碼*就是*編譯。這是一個運行時錯誤。 – 2010-11-19 03:11:20

回答

6

因爲數組是基於零的。數組中的最高索引是51,但您正試圖訪問52.另外,在您的實現中,第一個索引爲0的卡片將永遠不會被訪問。

deck [i*4-1]=Card(i, "clubs"); 
+0

+1擊敗了我! :) – Alex 2010-11-19 03:09:10

+2

+1。在甲板上觸發一個超出限制的數組例外[52]。我不想添加一個額外的答案,因爲你很好,但我想補充說,從編程101他們教一個for循環通常是爲了(int i = 0;我 2010-11-19 03:14:13

3

在大小的數組deck52你要使用索引52這是無效的。

你可以改變你for環路:

for(int i=0; i<52; i+=4){ 
    deck [i] = Card(i, "spades"); 
    deck [i+1] = Card(i, "hearts"); 
    deck [i+2] = Card(i, "diamonds"); 
    deck [i+3] = Card(i, "clubs"); 
    } 
0

這看起來像功課,所以我會給你一些提示:

檢查你的for循環邏輯。

請記住,在數組中的第一項爲0而不是1

0

除了數組索引溢出問題。有可能是一個問題,這樣的:

int main(){ 
Deck deck=Deck(); 
// ... 
} 

沒有必要的是:你可以簡單地寫Deck deck;代替。但是這樣,如果你的編譯器沒有執行優化,你可能會得到代碼,試圖使用默認的assingment運算符來複制一個Deck對象,該運算符執行成員複製。因此,將嘗試複製一個Card固定大小的數組,並將一個固定大小的數組複製到另一個將無法正常工作。