SIGSEGV - hilfe!



  • Hi,

    ich lerne gerade in der Schule c++, und ich habe ein Problem: Das aktuelle Projekt ist ein Sudoku-Löser, der auf Basis einer Klasse "Sudoku" funktioniert, die alle Funktionen vereint, die dadefür benötigt werden. Die Definition der Klasse sieht wie folgt aus:

    private:
    int saeubern();
    int sudo[10][10][10];
    
    public:
    int eingabe();
    int ausgabe();
    int init();
    

    (Die Inhalte der Funktionen hab ich jetzt mal weggelassen.) Nun die public-Funktion, die Schwierigkeiten macht:

    // Die init() ist dafür da, um alle Einheiten des Arrays sudoku auf 1 zu stellen

    int init() {  
        for (int s = 1; s < 10; s++) {
            for (int z = 1; s < 10; z++) {
                for (int m = 1; m < 10; m++) {
                    sudo[s][z][m] = 1;
                }
            }
        }
    };
    

    Die int main() sieht aktuell so aus:

    int main() {
        Sudoku yvomf;
        yvomf.init();
        return 0;
    }
    

    Wenn ich das Programm mit gxx kompiliere, läuft der Compiler ganz normal durch, dann erzeugt das Programm beim Aufruf einen SIGSEGV. (Die genauen Addressen kann ich jetzt nicht angeben, da ich das Programm nicht zur Hand habe.)
    Ich habe es unter sowohl M$ Windows als auch unter Linux und FreeBSD ausprobiert, nirgends geht es. Auch mit den Semikolons nach den } habe ich experimentiert, es gibt keinen Unterschied.

    Danke,
    Felix



  • PudelDesTodes schrieb:

    int init() {  
            for (int z = 1; s < 10; z++) {
    //                      ^
    

    Sowas passiert wenn alle Variablennamen gleich wenig aussagekräftig sind 😉



  • Sorry, kleiner Fehler meinerseits. Musste den Code aus dem Gedächtnis abschreiben.



  • 1. das erste element eines arrays hat einen abstand von 0 und nicht 1
    2. for (int z = 1; s < 10; z++) //warum s < 10???
    3. das init sollte nicht explizit aufgerufen werden müssen, sondern die initialisierung dem konstruktor überlassen werden



  • PudelDesTodes schrieb:

    Sorry, kleiner Fehler meinerseits. Musste den Code aus dem Gedächtnis abschreiben.

    Wenn das nur ein Tippfehler war, ist der Code ansonsten fehlerfrei. Dein Problem liegt woanders.



  • oh, mit 2. war ich wohl viel zu spät 🙄



  • Danke für die schnellen Antworten ;-)!

    Das init hab ich als eigene Funktion gemacht, um später durch einen Klick auf "Neu" einfach den Array leeren zu können.

    Ich probiers jetzt mal auf einem anderen Rechner aus, vielleicht gehts da.

    Danke,
    Felix



  • gegen das nachträgliche verwenden der init funktion, um die werte zurückzusetzen, spricht ja nichts, aber ein frisch konstruiertes sudoku sollte bereits initialisiert sein. außerdem gibt es einen kleinen trick, wie man die 10 nur einmal angeben braucht:

    #include <iostream>
    using namespace std;
    
    template<int N>
    class Sudoku
    {
    public:
    	Sudoku() { init(); }
    
        void init()
        {
            for (int i = 0; i < N; ++i)
                for (int j = 0; j < N; ++j)
                    for (int k = 0; k < N; ++k)
                        sudo[i][j][k] = 1;
        }
    
        void show()
        {
            for (int i = 0; i < N; ++i)
            {
                for (int j = 0; j < N; ++j)
                {
                    for (int k = 0; k < N; ++k)
                        cout << sudo[i][j][k] << " ";
                    cout << "\n";
                }
                cout << "\n";
            }
        }
    
    private:
        int sudo[N][N][N];
    };
    
    int main()
    {
        Sudoku<10> s;
        s.show();
    }
    

Anmelden zum Antworten