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.
Benutzeravatar
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

curses - Probleme beim Bauen eines CDK-Wrappers

Beitragvon Necoro » Dienstag 23. Januar 2007, 22:56

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:

Beitragvon Rebecca » Mittwoch 24. Januar 2007, 09:39

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?
Benutzeravatar
Necoro
User
Beiträge: 24
Registriert: Freitag 23. Dezember 2005, 01:11
Wohnort: Stuttgart
Kontaktdaten:

Beitragvon Necoro » Mittwoch 24. Januar 2007, 19:14

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!

Wer ist online?

Mitglieder in diesem Forum: jan.b