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ä? 😕


Anmelden zum Antworten