Zugriffsverletzung (Segmentation Fault)
-
Hallo, ich bin noch sehr neu in c++, und kann mir einfach nicht erklären, wieso Dev-c++ im Debugmodus die Nachricht "In Ihrem Programm trat eine Zugriffsverletzung (Segmentation Fault) auf" erscheint...
Hier nur der relevante Code:in opponent.h:
class opponent { private: float reward[22][2][12]; public: void reset_reward(); };
in opponent.cpp:
void opponent::reset_reward() { int i; int j; for (i = 0; i <= 21; i++) { for (j = 0; j <= 11; j++) { reward[i][0][j] = 0; reward[i][1][j] = 0; //Hier tritt der Fehler auf, i=4, j=0 } } }
Weiß jemand, wieso dieser Fehler auftritt?
Danke
-
Wie rufst du reset_reward auf?
-
In der main - funktion:
int main(int argc, char *argv[]) { opponent opp; opp.reset_reward(); system("PAUSE"); return 0; }
-
<= durch < ersetzen??
-
Nein, ist leider das gleiche dann...
-
Hier bei mir (MSVC2005B2) funktioniert das prima.
-
Kann es sein, das es irgendwo anders dran liegt oder so?
Hier is mal der ganze Code...
Headerdatei:#include <iostream> #include <stdlib.h> struct match { int t; //Zeitebene bool result; int s[12]; //Problemzustand zum Zeitpunkt t int s2; //Sichtbare Gegnerkartenaugen bool a[12]; //Aktion zum Zeitpunkt t }; class opponent { private: float reward[22][2][12]; float c; struct match game; public: void reset_reward(); float r(); bool v(int s, int s2); float trainme(int n); opponent() { c = 0.7; } };
Quelldatei:
#include "opponent.h" #include <iostream> #include <stdlib.h> #define LOST 0 #define WON 1 #define REFUSE 0 #define TAKE 1 //#define DEBUG using namespace std; int cardvalue(int cardno); float opponent::r() { int i; reward[game.s[game.t-1]][game.a[game.t-1]][game.s2] = game.result; #ifdef DEBUG cout << "Wert von Aktion " << game.a[game.t-1] << " bei Zustand " << game.s[game.t-1] << " u. Gegnerkarte " << [game.s2] << "geändert zu " << reward[game.s[game.t-1]][game.a[game.t-1]][game.s2] << "." << endl; #endif for (i = game.t - 2; i >= 0; i--) { c = 0.7; reward[game.s[i]][game.a[i]][game.s2] = reward[game.s[i]][game.a[i]][game.s2] + c * (reward[game.s[i + 1]][game.a[i + 1]][game.s2] - reward[game.s[i]][game.a[i]][game.s2]); #ifdef DEBUG cout << "Wert von Aktion " << game.a[i] << " bei Zustand " << game.s[i] << " u. Gegnerkarte " << [game.s2] << "geändert zu " << reward[game.s[i]][game.a[i]][game.s2] << "." << endl; #endif } } bool opponent::v(int s, int s2) { if (reward[s][1][s2] == 0 && reward[s][0][s2] == 0) { int ret; ret = rand() % 4; if(ret == 3) { ret = 0; } else { ret = 1; } return(ret); } if (reward[s][1][s2] > reward[s][0][s2]) { return(TAKE); } return(REFUSE); } float opponent::trainme(int n) { int i; int j; int victs = 0; bool endgame = false; int cardsum = 0; //Summe der Kartenwerte int musthave; //Mindestens for (i = 0; i < n; i++) { int k; for (k = 0; k <= 11; k++) { game.s[k] = 0; game.a[k] = 0; game.s2 = 0; } game.t = 0; cardsum = 0; endgame = false; musthave = cardvalue(rand() % 8); //0 = 7; 1 = 8; ...7 = ass game.s2 = musthave; musthave += cardvalue(rand() % 8); while(endgame == false) { if(v(cardsum,game.s2) == TAKE) { game.s[game.t] = cardsum; game.a[game.t] = TAKE; cardsum += cardvalue(rand() % 8); if(cardsum > 21) {endgame = true;} game.t += 1; } else { game.s[game.t] = cardsum; game.a[game.t] = REFUSE; endgame = true; game.t += 1; } } if (cardsum <= 21 && cardsum > musthave) { game.result = WON; victs++; } else { game.result = LOST; } r(); } return(victs/n); } void opponent::reset_reward() { int i; int j; for (i = 0; i <= 21; i++) { for (j = 0; j <= 11; j++) { reward[i][0][j] = 0; reward[i][1][j] = 0; } } } int cardvalue(int cardno) { switch (cardno) { case 0: return(7); case 1: return(8); case 2: return(9); case 3: return(10); case 4: return(2); case 5: return(3); case 6: return(4); case 7: return(11); } }
Könnten da irgendwelche Fehlerquellen liegen?
(Entschuldigt den schlechten Stil, ich bin noch neu auf dem Gebiet...)
-
Tu doch den Code minimieren und debuggen.
Bye
-
Ich fass es nicht...
Kann mir jemand erklären, was man unter profiling versteht?
Ich habe gerade eins durchführenlassen - und jetzt funktionierts auf einmal perfekt!!!
Hä?