2

ausgeführt halte ich einen Fehler bekommen:"Zugriffsverletzung" Fehler, wenn C++ Programm

Unbehandelte Ausnahme bei 0x5a6fca58 (msvcr100d.dll) in Gofish.exe: 0xC0000005: Zugriffsverletzung Schreiben Lage 0x0ff3b113.

Der Code, den ich zu laufen bin versucht:

#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; 
} 

Der Compiler Ich bin mit Microsoft Visual C++ 2010 Express, ob das etwas bewirken könnten.

+1

Code-Formatierung ++? – Alex

+5

Klar kompiliert es. Wenn dies nicht der Fall wäre, hätten Sie 'Gofish.exe' nicht. – strager

+1

Wenn Sie eine Zugriffsverletzung erhalten, dann kompiliert der Code *. Das ist ein Laufzeitfehler. –

Antwort

6

Weil Arrays auf Null basieren. Der höchste Index in Ihrem Array ist 51, aber Sie versuchen, auf 52 zuzugreifen. Außerdem wird in Ihrer Implementierung niemals auf die erste Karte mit dem Index 0 zugegriffen.

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

+1 für mich zu schlagen! :) – Alex

+2

+1. hitting out of bound array Ausnahme auf Deck [52]. Ich möchte nicht eine zusätzliche Antwort hinzufügen, da Sie gut ist, aber ich möchte hinzufügen, dass von Programmierung 101 sie lehren, dass eine for-Schleife ist normalerweise für (int i = 0; i

3

Im Array deck der Größe 52 Sie versuchen Index 52 zu verwenden, die ungültig ist.

Sie können Ihre for Schleife ändern:

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

Diese wie Hausaufgaben sieht so werde ich Ihnen einige Hinweise geben:

Prüfen Sie die for-Schleife Logik. Denken Sie daran,

dass der erste Eintrag in einem Array ist 0 nicht 1.

0

Neben dem Array-Index Überlaufproblem. Es könnte ein Problem mit diesem sein:

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

Es gibt keine Notwendigkeit, dass: Sie einfach Deck deck; stattdessen schreiben können. Wenn Ihr Compiler jedoch keine Optimierungen durchführt, können Sie auf diese Weise einen Code erhalten, der versucht, ein Deck Objekt mit dem standardmäßigen Assignment-Operator zu kopieren, der eine elementweise Kopie ausführt. Daher wird versucht, ein Card Array fester Größe zu kopieren, und das Kopieren eines Array fester Größe zu einem anderen wird nicht ordnungsgemäß funktionieren.