curses - Probleme beim Bauen eines CDK-Wrappers

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

Da es sowas noch nicht gibt (bzw es nicht funktioniert), bin ich dabei einen Wrapper für das CDK (eine Curses-Widget-Lib) zu bauen...

Ich möchte gerne, dass ich in C eine Funktion init_CDK habe, die folgendermaßen aussehen soll:

Code: Alles auswählen

PyObject * init_CDK (PyCursesWindowObject* wo, /*mehr argumente */)
{
	WINDOW * win = wo->win;
	CDKScreen * screen = initCDKScreen(win);
	/*mehr*/
}
Dann könnte ich unter Python folgendes machen:

Code: Alles auswählen

screen = curses.initscr()
init_CDK(screen)
Dies führt leider zu einem Segfault (in noecho(), welches von initCDKScreen() aufgerufen wird) - ich muss die C-Funktion so schreiben, dass sie selber das initscr() ausführt:

Code: Alles auswählen

PyObject * init_CDK (/*mehr argumente */)
{
	WINDOW * win = initscr();
	CDKScreen * screen = initCDKScreen(win);
	/*mehr*/
}
Damit kann ich in Python leider keine curses.* Funktionen mehr nutzen, da mir immer gesagt wird, dass curses nicht initialisiert ist. (Es sei denn, ich rufe curses.initscr() so nochmal auf, was man laut curses-manpage aber nicht darf)

Aber die eigentliche Frage: Warum führt das erste zu einem Segfault? - Ich habe mir den _cursesmodule.c-Quellcode schon mehrfach angeschaut und bin zu dem Schluss gekommen, dass curses.initscr() auch nur initscr() aufruft und den erhaltenen Zeiger denn in ein PyCursesWindowObject packt.

Vielleicht hat ja jmd ne Idee :) (oder wahlweise einen funktionierenden CDK-Wrapper :P )

(Anm: Bevor jmd den allgemeinen Aufbau der C-Teile bemängelt - ich schreib das in Pyrex und habe nur schnell die Funktionen "übertragen".)
Inter Deum Et Diabolum Est!
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Nur mal so eine Vermutung: In der C-API-Doku (http://docs.python.org/ext/backToExample.html) steht, dass man die Argumente vom Aufruf aus Python, die man mit PyArg_ParseTuple parst, Zeiger auf bestehende Objekte sind, die man nicht aendern soll.

Vielleicht ist das dein Problem: dass initCDKScreen das Window-Objekt modifiziert? Denn genau dieses Problem hast du ja in deiner zweiten Version nicht mehr, da hier das Window-Objekt komplett neu erzeugt wird. D.h. man muesste im ersten Fall eine Kopie des Window-Objektes erzeugen, aber ob es Sinn macht, mit zwei Window-Instanzen zu hantieren?

_cursesmodule.c fuehrt intern eine globale Variable initialised, die angibt, ob initscr() schon ausgefuehrt wurde oder nicht...

Wenn es nicht unbedingt CDK sein muss, vielleicht magst du ja mal einen Blick auf urwid werfen?
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

Rebecca hat geschrieben:Nur mal so eine Vermutung: In der C-API-Doku (http://docs.python.org/ext/backToExample.html) steht, dass man die Argumente vom Aufruf aus Python, die man mit PyArg_ParseTuple parst, Zeiger auf bestehende Objekte sind, die man nicht aendern soll.

Vielleicht ist das dein Problem: dass initCDKScreen das Window-Objekt modifiziert?
Das klingt zwar plausibel - aber da initCDKScreen nichts von den Python-Objekten mitbekommt, sondern nur die Kopie des C-Zeigers, der in diesem Objekt gespeichert wurde, glaube ich das nicht.
_cursesmodule.c fuehrt intern eine globale Variable initialised, die angibt, ob initscr() schon ausgefuehrt wurde oder nicht...
Das stimmt - leider ist diese static und damit nicht von mir aus veränderbar...
Wenn es nicht unbedingt CDK sein muss, vielleicht magst du ja mal einen Blick auf urwid werfen?
urwid hab ich schon ausprobiert -- und da es sehr schlecht dokumentiert ist, nach zwei Tagen des Herumexperimentierens wieder aussortiert :)
Inter Deum Et Diabolum Est!
Antworten