Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hi @ll
(ich schreibe das [FPC] dazu, weil der doch etwas weniger verbreitet ist als Delphi und daher die Exception etwas fremd)
Also, wie man aus dem Titel erkennen kann, arbeite ich mit dem FreePascal Compiler und Lazarus. Der Debugger ist ja noch nicht sooo ausgereift, daher musste ich mir mit Debug-Nachrichten die genaue Stelle im Code rausfriemeln.
Code:
function TfntFont.RenderToTexture(const Text:String): TgglTexture2D;
Also liegt der Fehler eindeutig im Call von TTF_RenderText_Blended. Ich habe so eine ähnliche Funktion schon einmal geschrieben, allerdings wurde da der Font mit als Parameter übergeben, hier ist er Eigenschaft einer Klasse. (ein Pointer auf PTTF_Font).
Laut Wiki sollte TTF_RenderText_Blended nur einen solchen Fehler rauswerfen, wenn Font = nil ist, allerdings wird das ja weiter oben überprüft und laut Log ist es eindeutig nicht nil.
An der Color-Variable kann es (eigentlich) auch nicht liegen, die wird ja von FPC mit erstellt. Ich habe auch schon versucht, sie als Pointer zu erstellen und dann dereferenziert an die Funktion zu übergeben, hat aber auch nichts gebracht.
Die TTF-Bibliothek ist initialisiert, sonst hätte der Font nicht geladen werden können und es hätte ein TTF-Fehler in der Nachricht gestanden.
Ich hoffe, irgendjemand kann mir helfen, ich bin hier am verzweifeln...
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Lokale Variablen sind nicht initialisiert. Du hast da bereits am Anfang der Methode irgendetwas drinne stehen. Solche Sachen solltest du am Anfang immer mit nil initialisieren etc.
Hast du SDL_ttf initialisiert? Scheint mir nicht so.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
SDL_TTF wird direkt beim Programmstart initialisiert und bei Fehlschlag wird das Programm abgebrochen. Der einzige TTF_Quit-Call ist in der Prozedur FreeSDL, welche nur am Ende aufgerufen wird.
Der Speicher für SDL_Color sollte aber doch implizit reserviert werden, ist ja kein Pointer sondern ein record. Die Werte werden dann ja im Code gesetzt.
Ich habe festgestellt, dass der FPC da irgendwas anders macht als Delphi. Ich habe mal ganau die Prozedur die ich schon in einem Delphi-Projekt verwendet habe implementiert und auch dort schmiert er mit ner Exception ab.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Gerade ausprobiert und es bleibt bei dem Fehler. Meine Vermutung liegt wie gesagt bei dem Color-Teil, was als große Ausnahme mal nicht als Pointer übergeben werden muss. Der gleiche Code scheint unter Delphi zu funktionieren, es ist allerdings schon länger her, dass ich ihn verwendet habe und ich bin mir auch nicht sicher, ob beim "Transkriptieren" in FPC was verloren gegangen ist (musste einige andere Funktionen verwenden).
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Das funktioniert bei mir sowohl in Delphi als auch in Free Pascal. Ich nehme zwar TTF_RenderText_Solid und nicht TTF_RenderText_Blended, aber ich nehme an, dass die Parameter die gleichen sind.
Folgendes ist mir oben bei Deinen Ausführungen aufgefallen:
Zitat:
Also liegt der Fehler eindeutig im Call von TTF_RenderText_Blended. Ich habe so eine ähnliche Funktion schon einmal geschrieben, allerdings wurde da der Font mit als Parameter übergeben, hier ist er Eigenschaft einer Klasse. (ein Pointer auf PTTF_Font).
Ein Pointer auf PTTF_Font wäre fatal, denn PTTF_Font IST schon ein Pointer.
Traude
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Traude hat geschrieben:
Folgendes ist mir oben bei Deinen Ausführungen aufgefallen:
Zitat:
Also liegt der Fehler eindeutig im Call von TTF_RenderText_Blended. Ich habe so eine ähnliche Funktion schon einmal geschrieben, allerdings wurde da der Font mit als Parameter übergeben, hier ist er Eigenschaft einer Klasse. (ein Pointer auf PTTF_Font).
Ein Pointer auf PTTF_Font wäre fatal, denn PTTF_Font IST schon ein Pointer. Traude
Huch, das war ein Tippfehler
Deine Methode funktioniert leider auch nicht... Ich bin langsam echt am Verzweifeln.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Benutz mal bitte eine Methode bei der du keine Farbe übergeben musst. Also so etwas wie TTF_FontAscent. Nur mal um zu sehen ob überhaupt etwas geht. Weil was mich ein wenig wundert ist das was du über die Farbe gesagt hast. Ja das ist kein Pointer. ABER unter Delphi werden Records automatisch als Pointer übergeben und bei FPC ist das nicht so der Fall. Das hatten wir im Header auch mal, dass es deswegen dort unter fpc nicht so ganz geklappt hat. Was mich aber echt wundert ist, dass es ja dann eigentlich im sdl header falsch sein müsste. Und das es dort bisher noch nicht aufgefallen ist kann ich mir einfach nicht vorstellen.
Zur Not ändere mal händisch deinen Header und setze bei der Farbe mal ein const davor. Nur so ein versuch. Dann wir das nämlich expliziet als Pointer übergeben. Wenn er einen Pointer fälschlicherweise als Farbe interprettiert ist das egal aber wenn er eine Farbe als Pointer interprettiert, dann ist das nicht so gut.
Wobei ich gerade mal geschaut habe und die Funktionen wollen irgendwie tatsächlich keine Pointertyp.
Bist Du Dir mit dem Const da sicher? Ich meine const erzwingt call by value (Worth), und das wäre eine Kopie. Ich denke eher, das Var die richtige Direktive ist. Diese erzwingt Call by Reference (Wirth), und das wäre dann ein Pointer.
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich bin mir ziemlich sicher, dass const intern auch als Pointer übergeben wird. Wenn du gar nichts angibst dann wird eine Kopie davon erstellt und diese übergeben. Bei LongStrings wird diese (unter Delphi) zu mindest erst dann erstellt wenn der Text verändert werden soll.
Aber wie sicher kann man sich in der Programmierung schon sein. Eigentlich sollte es ja auch funktionieren. Im Zweifel einfach mal beides ausprobieren.
Wenn man nix angibt, ist das call by value (Kopie). Das verhindert, dass Änderungen am Parameter wieder nach außen gelangen. const verschärft dieses, indem zusätzlich die Änderung der Kopie verboten wird, d.h. man kann innerhalb der Methode den Parameter nicht für die eigenen Zwecke verändern.
Var bedeutet, dass Änderungen innerhalb der Methode sich auch auf den Wert ausserhalb auswirken (daher call by Reference->Pointer). Diese Direktive kann man noch mit Out 'verschärfen' Out bedeutet nix anderes als var, nur dass dem Aufrufenden deutlich gemacht wird, dass der übergebene Wert nicht genutzt wird, sondern der Parameter nur als Platzhalter für einen Ergebniswert dient. Mit Out übergebene Parameter sollten also innerhalb der Methode nicht gelesen werden, da sie nicht initialisiert werden.
[edit] ich hab grad gelesen, dass man Const-Parameter zusätzlich nichtmehr als var-Parameter weitergeben kann[/edit]
_________________ Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Ich glaube nicht, dass es an der Farbe hängt. Ich hab es jetzt ausprobiert: ich habe meine eigene Prozedur umgestellt von einer Konstante auf eine (in der Prozedur selbst definierte und befüllte) Farb-Variable und es war wieder kein Problem. Ich hab umgestellt auf Render_Text_Blended, wieder kein Problem (es kommt keine Ausgabe, weil die ganze Software auf Render-TextSolid abgestellt ist, aber er stürzt nicht ab), beides sowohl in Delphi als auch in FPC ausprobiert. Ich tippe viel eher auf die Initialisierung der Library.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Also TTF IST initialisiert, das wird jetzt auch in der Methode mit TTF_WasInit <> 0 überprüft.
Ich habe schon heute morgen einmal ausprobiert den Header so zu ändern, dass der einen PSDL_Color haben will anstatt TSDL_Color, hat aber das gleiche bewirkt wie das vorsetzen von var. Es kam ein anderer Fehler. Und zwar jetzt nicht mehr die Exception "External: Sigsegv" sondern direkt ein Debuggerstopp mit Prozedurzeiger usw. und dem hinweis, das irgendwann in ferner zukunft da auch noch ein Assembler-Dump hinkommen wird.
TTF_FontAscent funktioniert prächtig, ich bekomme ohne weiteres eine acht zurückgeliefert, ohne fehler.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich für meinen Teil muss dann passen. Das Einzige was mir noch so einfallen würde, wäre die Binarys mal auf einem anderem System auszuprobieren. Oder auf deinem System mal andere Programme die auch SDL_ttf benutzen. Aber nach möglichkeit sollten die nicht mit deinem FPC übersetzt werden. Nur um auszuschließen ob es nicht irgendwas im System ist.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Also wie gesagt, ich habe schon in einem anderen Projekt die SDL_TTF verwendet, das lief auch prächtig, allerdings mit Delphi kompiliert.
Ich habe Lazarus portable aufm Stick und entwickle zwischendurch auch in der Schule, da lief es auch nicht, die DLL's liegen dabei alle im Anwendungsverzeichnis.
//Edit: Gelöst!
SDL_TTF wollte anscheinend die Daten noch nach dem Aufruf von TTF_LoadRW im Speicher haben - ich hatte sie allerdings freigegeben.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 15 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.