[LUA]Problem mit returnwert einer c++ Funktion

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
LuckyBlade
Beiträge: 16
Registriert: 08.09.2009, 15:40
Echter Name: Felix Klinge
Wohnort: Münster
Kontaktdaten:

[LUA]Problem mit returnwert einer c++ Funktion

Beitrag von LuckyBlade »

Hi Leute,

ich hab ein kleines Problem mit einer C++ Funktion,die ich aus Lua ausrufe.

Folgendes:
In C++ habe ich eine Timer Klasse..Das ist eine Art Countdown.

Folgende Funktionen gibt es für diese Klasse in Lua:
CreateTimer(float time) - erstellt einen neuen Timer mit Argument 'time' als Laufzeit
StartTimer() - selbsterklärend
StopTimer() - selbsterklärend
IsRunning() - gibt true zurück,wenn der Timer läuft und false wenn nicht. (Hier liegt mein Problem.)

Folgendes Lua Skript habe ich:

Code: Alles auswählen


function Init()
Test_Surface = CreateSurface("Test.png")
Test_Timer = CreateTimer(200)
StartTimer(Test_Timer)
end

function Update()
    if IsRunning(StartTimer) == true then
        Graphics.RenderSurface(Test_Surface)
    end
end
Die C++ Funktion sieht so aus:

Code: Alles auswählen

int IsRunning(lua_state *state)
{
Timer *test_timer = (Timer*)lua_touserobj(state,1) //Oder so ähnlich,hab die .cpp grad nicht zur Hand
lua_pushboolean(state,test_timer->IsRunning);
return 1;
}
Wenn ich per Debug in mein Programm reingehe,klappt alles wunderbar.

Das Surface wird erstellt,gerendert und der Timer wird geprüft.
Allerdings wird das Surface gerendert,obwohl die Funktion IsRunning false zurückgibt (geprüft mit dem Debugger). Ich kann mir absolut nicht erklären,was da falsch läuft.

Macht für mich den Eindruck, als würde Lua den Rückgabewert der Funktion beim 1. Aufruf speichern und danach immer diesen Wert zurückgeben,wenn die Funktion aufgerufen wird.

Hoffe hier ist jemand,der mir etwas helfen kann.
Visit my Blog or
follow me on Twitter.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von kimmi »

Welche IsRunning-Funktion hast du dir angeschaut? Die Lua- oder die C++-Funktion? Wird Graphics.RenderSurface(Test_Surface) gerufen ( kannst ja ein print einbauen, um das zu valisieren ) ? Wenn die Renderfunktion nicht gerufen wird, wird dann nichts gezeichnet oder siehst du den zuvor durchgeführten Update des Rendertargets?

Gruß Kimmi
joggel

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von joggel »

Und wenn beim ersten Durchlauf der Timer false zurückgibt? Wird da auch gerendert?
LuckyBlade
Beiträge: 16
Registriert: 08.09.2009, 15:40
Echter Name: Felix Klinge
Wohnort: Münster
Kontaktdaten:

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von LuckyBlade »

Nein,dann nicht.

Wird der Timer dann allerdings nachträglich gestartet,wird das bild auch nich gerendert(obwohl es gerendert werden müsste)
Visit my Blog or
follow me on Twitter.
joggel

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von joggel »

Die Lua-Funktion "IsRunning" gibt auch dieselben Werte zurück, wie die C++-IsRunning-Funktion?
LuckyBlade
Beiträge: 16
Registriert: 08.09.2009, 15:40
Echter Name: Felix Klinge
Wohnort: Münster
Kontaktdaten:

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von LuckyBlade »

Das ist ein und die selbe Funktion.
Beim Start meines Programmes registriere ich die Funktionen,welche ich in Lua benutzen möchte per
lua_registerlib (oder so ähnlich heißt die funktion).

Die Renderfunktion klappt auch...Wenn sie es nicht würde,würde auch das Bild nicht gerendert werden.
Visit my Blog or
follow me on Twitter.
joggel

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von joggel »

DOch, laut dieser Quellen
http://gamedevgeek.com/tutorials/callin ... -from-lua/
http://lua-users.org/wiki/UserDataWithPointerExample

sind die Funktionen static.
Hast Du das schon probiert?
Aber ich persönlich kenne mich da kaum aus...
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von kimmi »

Hast du dir schon mal den Lua-Stack vom State angeschaut? Vielleicht muss man die Ergebnisse nach der Rückgabe noch poppen bzw. nacharbeit leisten? Da sollte der Inhalt des Lua-Stacks Aufschluss darüber geben. Wenn beispielsweise 3 trues und ein false darauf liegen, ist deine Theorie richtig und der Stack wird nicht richtig abgeräumt.

Gruß Kimmi
LuckyBlade
Beiträge: 16
Registriert: 08.09.2009, 15:40
Echter Name: Felix Klinge
Wohnort: Münster
Kontaktdaten:

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von LuckyBlade »

Daran lag es leider auch nicht.
Hab es so probiert:

Code: Alles auswählen

(Das ist die C++ IsRunning Funktion,die von Lua aus aufgerufen wird.)

    Timer *timer = (Timer*)lua_touserdata(state,1);
    lua_pop(state,1);
    lua_pushboolean(state,timer->IsStarted);
    int x = lua_gettop(state); //x = 1 also eine Variable auf dem Stack.
    return 1;

Trotzdem wird das Bild weiter gerendert.

Edit:

Ich hab grad mehr oder weniger zufällig rausgefunden,dass jedesmal ein neuer Speicherblock bereit gestellt wird wenn man lua_touserdata aufruft.

D.h. beim ersten Aufruf von IsRunning hat timer die Adresse 0x10209a0,beim zweiten Aufruf dann allerdings 0x22fd58... Also 1. wird das lua intern so geregelt,dass jedesmal ein neues Objekt erstellt wird und dem praktisch die Attribute des alten Objekts übergeben wird oder irgendwas läuft da falsch (GarbageCollector von lua löscht evtl den Timer...Wobei mir dann schleierhaft ist,wieso dann ein neues Objekt erstellt wird...Müsste ja dann NULL sein eigentlich)


Vergesst es...Dummer vorschneller Fehler von mir -.-
Visit my Blog or
follow me on Twitter.
Dirk Schulz
Establishment
Beiträge: 130
Registriert: 01.03.2009, 14:21
Alter Benutzername: frittentuete

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von Dirk Schulz »

Hi,

kenne mich mit LUA zwar überhaupt nicht aus, aber tatsächlich wird die Funktion lua_touserdata() in Tutorials hauptsächlich im Konstruktor einer Klasse benutzt.

Um auf ein bestimmtes Objekt zugreifen zu können, was schon erstellt ist, benutzen sie dann in den Tuts luaL_checkudata().

Wie gesagt, aufgrund von Ahnungslosigkeit meinerseits nur ein Tipp, den man mal probieren kann. :!:
LuckyBlade
Beiträge: 16
Registriert: 08.09.2009, 15:40
Echter Name: Felix Klinge
Wohnort: Münster
Kontaktdaten:

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von LuckyBlade »

Dirk Schulz hat geschrieben:Hi,

kenne mich mit LUA zwar überhaupt nicht aus, aber tatsächlich wird die Funktion lua_touserdata() in Tutorials hauptsächlich im Konstruktor einer Klasse benutzt.

Um auf ein bestimmtes Objekt zugreifen zu können, was schon erstellt ist, benutzen sie dann in den Tuts luaL_checkudata().

Wie gesagt, aufgrund von Ahnungslosigkeit meinerseits nur ein Tipp, den man mal probieren kann. :!:
Danke für den Tipp!

Werde ich nachher in der Mittagspause mal ausprobieren.
Müsste dafür dann allerdings noch die Metatabellen anlegen,damit das gescheit funktioniert (so wie ich das verstanden hab), da einerseits die Adresse dem pointer zugeordnet wird und andererseits geprüft wird,dass die übergebene Adresse auch ein Typ des objektes ist auf das der pointer zeigt,der die Adresse entgegen nimmt.

Meld mich dann nachher nochmal ;)
Visit my Blog or
follow me on Twitter.
joggel

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von joggel »

LuckyBlade hat geschrieben: ...
Ich hab grad mehr oder weniger zufällig rausgefunden,dass jedesmal ein neuer Speicherblock bereit gestellt wird wenn man lua_touserdata aufruft.

D.h. beim ersten Aufruf von IsRunning hat timer die Adresse 0x10209a0,beim zweiten Aufruf dann allerdings 0x22fd58... Also 1. wird das lua intern so geregelt,dass jedesmal ein neues Objekt erstellt wird und dem praktisch die Attribute des alten Objekts übergeben wird oder irgendwas läuft da falsch (GarbageCollector von lua löscht evtl den Timer...Wobei mir dann schleierhaft ist,wieso dann ein neues Objekt erstellt wird...Müsste ja dann NULL sein eigentlich)


Vergesst es...Dummer vorschneller Fehler von mir -.-
Also sorry das ich noch mal komme...
Aber hast Du wirklich darauf geachtet, das die Funktionen static sind?
LuckyBlade
Beiträge: 16
Registriert: 08.09.2009, 15:40
Echter Name: Felix Klinge
Wohnort: Münster
Kontaktdaten:

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von LuckyBlade »

Ja das sind sie.
Der Fehler war einfach nur,dass ich in meiner hektik (als ich die Funktion so umgebaut hab,dass der die Größe des Stacks ausgegeben wird) die Funktionsnamen falsch geschrieben hab.
Anstatt "GetUserData" hatte ich "PushUserData"...Sodass bei jedem Aufruf von IsRunning /Stop und Start ein neues Objekt erzeugt wurde,anstatt das vom Stack zu holen. :roll:

Deswegen hab ich auch das ganze gedöns da oben durchgestrichen weil es ja mumpitz war und die Vermutung ja nur durch meine eigenen Schlampigkeit zustande kam :D

Jetzt ist es wieder so wie vorher...Hab das dann nochmal geprüft und es wird KEIN neues Objekt erzeugt (außer halt bei CreateTimer).Es wird immer das selbe Objekt übergeben.

Das mit dem luaL_checkudata() werde ich -wie gesagt- gleich in meiner Mittagspause probieren.
Visit my Blog or
follow me on Twitter.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von kimmi »

Da ich da auch schon öfter nach solchen Fehlern gesucht habe: bei sowas hilft es, einen Debug-Call zu implementieren, mit dem du dir den Lua-Stack anschauen kannst. In der ZFXCE haben wir so etwas, wenn das auch mal refactored werden sollte.

Gruß Kimmi
LuckyBlade
Beiträge: 16
Registriert: 08.09.2009, 15:40
Echter Name: Felix Klinge
Wohnort: Münster
Kontaktdaten:

Re: [LUA]Problem mit returnwert einer c++ Funktion

Beitrag von LuckyBlade »

Autsch...Ich hab's hinbekommen.
Hab mir jetzt mal VS2010 und Decoda drauf gehauen,damit ich gescheit debuggen kann (Geht mir CodeBlocks und ScITE bestimmt auch,aber kein Plan wie).

Die IsRunning Funktion gibt tatsächlich false zurück,wenn der Timer abgelaufen ist.
Der Fehler war (und das ist wirklich dumm), dass ich NUR das Bild gerendert hab...Ich hatte keinen Hintergrund.Das Bild wurde direkt auf das Screen Surface gerendert und dadurch auch noch angezeigt,selbst nachdem die Renderfunktion nicht mehr aufgerufen wird.(Weil nicht 'drüber gemalt' wurde)...

Könnte mir selbst in den Arsch beißen!!
Aber egal...Wie heißt es doch so schön?Aus Fehlern lernt man...
Visit my Blog or
follow me on Twitter.
Antworten