Seite 1 von 1

Fehler nach einfügen einer Variablendeklaration

Verfasst: 11. Oktober 2012 21:05
von jw202
Hallo,

ich habe ein primitives Schach programmiert (noch ohne Funktionen), welches sich sehr seltsam verhält.


Hier ist das Package: http://jowin.at/downloads/qtforum.zip


Folgendes Problem tritt auf: In der Datei mainwindow.h befindet sich unter anderem folgender Code

Code: Alles auswählen

private:
    Ui::MainWindow *ui;
    void redraw();
    int grauX;
    int grauY;
    bool cursor;
    int *a; //HIER IST DAS PROBLEM!!!!!
    chessPiece *field[8][8];
das Problem liegt an der Zeile int *a; (Zeile 37)

Sofern diese Zeile vorhanden ist, stürzt das Programm bei einem Klick auf das Schachfeld ab. Sofern ich diese Zeile auskommentiere, geht alles ohne Probleme. Über eine Erklärung wäre ich sehr dankbar. Dieser Fehler ist sehr unlogisch, da die besagte Variable int *a im Code garnicht verwendet wird.


LG und danke schon im Voraus.

Re: Fehler nach einfügen einer Variablendeklaration

Verfasst: 11. Oktober 2012 21:25
von jw202
UPDATE: jetzt versteh ich die Welt absolut nicht mehr. Wenn ich die Zeile "bool cursor;" weglasse, dann funktioniert alles. WIESO? das ist eine harmlose bool Variable. Das ergibt keinen Sinn. Ich bitte um Aufklärung.

Code: Alles auswählen

private:
    Ui::MainWindow *ui;
    void redraw();
    int grauX;
    int grauY;
    chessPiece *field[8][8];
    int *a; //so funktionierts

Re: Fehler nach einfügen einer Variablendeklaration

Verfasst: 11. Oktober 2012 21:38
von Christian81
chessPiece ist ein Pointer und du greifst ohne diesen zu initialisieren darauf zu. Also den Pointer erst initialisieren, dann darauf zugreifen. Oder noch besser da wir hier C++ benutzen - nimm einen std-Container wie z.B. std::vector

Re: Fehler nach einfügen einer Variablendeklaration

Verfasst: 11. Oktober 2012 22:17
von jw202
danke für den hinweis. ich werd mir das mit der datenstruktur nochmal überdenken.


allerdings: warum tritt das Problem nur dann auf, wenn ich einen weiteren Pointer in der Header Datei aufnehme? Das Programm funktioniert fehlerfrei, wenn ich die Pointerdeklaration von int *a; herausstreiche.

außerdem habe ich sichergestellt, dass im Konstruktor von MainWindow die Funktion MainWindow::resetField() aufgerufen wird, wo alle 64 Felder von chessPiece *field[8][8]; definiert werden. Also dürfte es damit keine Probleme mehr geben.

Re: Fehler nach einfügen einer Variablendeklaration

Verfasst: 11. Oktober 2012 22:48
von Christian81
Ignoriere meinen vorigen Post - geistige Umnachtung. Mein Kommentar mit C++ stimmt aber noch :)
Dein Fehler sind fehlende Initialisierungen von grauX und grauY. Dadurch stürzt das Programm beim Klick ab.

Re: Fehler nach einfügen einer Variablendeklaration

Verfasst: 14. Oktober 2012 08:54
von franzf
Das nennt sich "Default-Initialisierung", wenn es dich interessiert:
http://www.open-std.org/jtc1/sc22/wg21/ ... /n3242.pdf
8.5 Unterpunkt 6 dritter Strich.
(Eine Ausnahme gibts für Templates: da werden diese primitiven Typen automatisch null-initialisiert).

Und wg. dem Kommentar zu "C++":
* Zieh deine Schach-Logik aus MainWindow raus.
* Separier dein Schachbrett in eine einfache Speicherklasse
* Halte dort deine Schachbrettfelder in einem eindimensionalen vector
* Zugriff über (z.B.) fieldAt(int x, int y) { return _vec[y*8 + x]; }