newwin Speicherzugriffsfehler - C++



  • Ich schreibe gerade eine Fensterklasse. Leider hab ich das Problem, dass beim newwin, oder subwin Funktionsaufruf das Prog zur Laufzeit mit einem Speicherzugriffsfehler abstürzt. Woran könnte das liegen?

    cwindow.hpp

    #include <ncurses.h>
    
    #ifndef CWINDOW_INCLUDED
    	#define CWINDOW_INCLUDED
    
    	class WinObj
    	{
    		public:
    			WinObj();		/* Standartkonstruktor */
    			WinObj(int lines, int cols, int y, int x);	/* zum Erzeugen eines neuen Fensters */
    
    		private:
    			WINDOW* pwin;	/* Zeiger auf das Fenster */
    			int lines;		/* Anzahl der Zeilen des Fensters */
    			int cols;		/* Anzahl der Spalten des Fensters */
    			int x_position;		/* x-Curserposition */
    			int y_position;		/* y-Curserposition */
    
    	};
    #endif
    

    cwindow.cpp

    #include "cwindow.hpp"
    
     /************************* Konstruktoren **************************/
     /* Defaultkonstruktor - erzeugt Fenster der Standdartgroesse */
     WinObj::WinObj()
     {
    	this->lines = 24;
    	this->cols = 80;
    	this->x_position = 0;
    	this->y_position = 0;
    
    	this->pwin = newwin(this->lines, this->cols, this->x_position, this->y_position);
     }
    
     /* Konstruktor, der neues Fenster mit uebergebenen Werten erzeugt */
     WinObj::WinObj(int lines, int cols, int y, int x)
     {	
    	this->lines = lines;
    	this->cols = cols;
    	this->x_position = x;
    	this->y_position = y;
    
    	this->pwin = newwin(this->lines, this->cols, this->x_position, this->y_position);
     }
    

    Villeicht wäre dieser Beitrag ja auch im C++ Forum gut aufgehoben, hab nur gedacht das Curses villeicht eher was mit Linux zu tun hat und es sich nicht um ein C++ Problem habndelt.



  • Hallo Richard!

    Bin mit C++ nicht besonders bewandt. Programmiere selbst nur C und Objective-C.
    In der Methode WinObj::WinObj() werden this->lines und this->cols feste Werte zugewiesen. Bist du sicher dass das Terminalfenster immer 24 x 80 gross ist. Ich würde es vielleicht so machen:

    WinObj::WinObj()
     {
        this->lines = LINES; /* LINES und COLS werden durch den Aufruf von initscr()    initialisiert. */
        this->cols = COLS;
        this->x_position = 0;
        this->y_position = 0;
    
        this->pwin = newwin(this->lines, this->cols, this->x_position, this->y_position);
     }
    

    Wenn es sich um xterm handelt habe ich die aktuelle Grösse bisher so festgestellt:

    int y, x;
    getmaxyx(stdscr, y, x);
    ...
    

    Gruß
    Michael



  • WinObj::WinObj() kann einfach WinObj::WinObj(int lines, int cols, int y, int x) aufrufen mit festen werten. oder du nimmst default parameter. jedenfalls brauchste da keine zwei identischen funktionen. ...und schek den rückgabewert von newwin(). eventuell ist der 0 und deshalb kracht es



  • Schon einen Debugger benutzt? Der kann dir sagen, wo genau der Fehler auftritt.

    Oder Valgrind? Das kann eventuell noch sagen, was du falsch gemacht hast.



  • Danke erstmal für die Anworten :), werde das dann gleichmal ausprobieren.

    Mit dem Debugger bin ich drüber gegangen, der ist immer genau beim newwin() abgeschmiert und ich konnte auch nicht in die Funktion hinneingehen, wenn ich die entsprechende Debbuger Funktion aufgerufen habe.

    Mit Valgrind hab ich es noch gar nicht probiert und wußte auch nicht, dass ich damit in gewisser Weise auch debbugen kann. Ich hab es einfach immer nur genutzt um Speicherleaks zu finden...



  • Ist der vor dem Aufruf von newwin() abgeschmiert oder darin?

    Wenn es darin ist, wie ist der Code? Wie sehen die übergebenen Werte aus?

    Wenn es davor ist, wie ist der Wert von this?

    Wie ist der genaue Traceback beim Absturz?


Anmelden zum Antworten