Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

29.07.2013, 11:38

"Dem Funktionsaufruf fehlt die Argumentenliste..."

Hi Leute,
ich habe gerade angefangen Lua in mein Programm einzubinden und bin schon auf ein Problem gestoßen.
Wenn ich eine Funktion registrieren will, also mit "lua_register", muss ich ja die Funktion übergeben. Das sieht dann so aus:

C-/C++-Quelltext

1
lua_register(this->mLuaInt, "setWindowTitle", this->LUA_setWindowTitle);



Wenn ich die Funktion "LUA_setWindowTitle" nicht statisch mache, wirft er mir den im Titel genannten Fehler vor die Nase. Also gut, dachte ich mir. Dann mache ich die Funktion eben statisch.
Wenn ich nun aber aus der statischen Funktion "LUA_setWindowTitle" eine weitere Memberfunktion aufrufen will, sagt der Compiler, dass das, aus statischen Funktionen aus, nicht funktioniert.

Ich habe jetzt bereits eine weile darüber nachgedacht und komme einfach nicht auf eine Lösung. Und google'n bringt erst recht nichts. Also seit ihr gefragt:)


MfG
RenX

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »RenX313« (29.07.2013, 11:49)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

29.07.2013, 11:43

Wer ist "er", in "wirft er mit den im".

PS: Seit mit Zeit und sonst "seid".
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

29.07.2013, 11:46

Ja der Compiler.

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

4

29.07.2013, 12:20

Ich fürchte du verstehst lua_register falsch. Im Lua Reference Manual steht schon:

Zitat von »Lua Reference Manual«


It is defined as a macro:

C-/C++-Quelltext

1
2
#define lua_register(L,n,f) \
            (lua_pushcfunction(L, f), lua_setglobal(L, n))

lua_pushcfunction() hat wiederum den Prototyp

C-/C++-Quelltext

1
void lua_pushcfunction (lua_State *L, lua_CFunction f);

Und wenn du dir die Dokumentation zu lua_CFunction durchliest, wirst du feststellen, dass eine solche Funktion eine speziell für Lua geschriebene Funktion ist, die ein ganz bestimmtes Verhalten und einen ganz bestimmten Prototyp haben muss.


Dein Compilerfehler kommt aber von einem anderen (obwohl nahe verwandtem) Problem: Es gibt das (Funktions-)Objekt objekt->f als solches nicht. objekt->f(argumente) wird vom Compiler in etwa (würde so nicht kompilieren) wie Klasse::f(objekt, argumente) behandelt (wenn man virtuelle Funktionen außer Acht lässt).

Zitat

Wenn ich nun aber aus der statischen Funktion "LUA_setWindowTitle" eine weitere Memberfunktion aufrufen will, sagt der Compiler, dass das, aus statischen Funktionen aus, nicht funktioniert.

Eine statische Funktion wird ohne (unsichtbares) this-Argument aufgerufen. Wenn sie jetzt eine Memberfunktion aufrufen könnte, auf welchem Objekt würde die dann arbeiten (welches this-Argument würde sie bekommen)? Eine statische Memberfunktion verhält sich in dieser Hinsicht wie eine freie ("normale", nicht-Member) Funktion. Sorry, aber da fehlt es dir anscheinend noch an Grundlagen, die du dir besser aneignen solltest, bevor du dich an so etwas versuchst.

5

29.07.2013, 12:52

Bei allem Respekt, Oberon, aber ich denke du verstehst Lua nicht.
Eine Lua Funktion muss einen Integer zurückgeben und als Argument ein lua_State annehmen.

Solange ich diese Funktion statisch mache und nicht versuche eine Memberfunktion aus dieser Funktion aufzurufen, funktioniert alles auch.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

29.07.2013, 12:59

Wobei Oberon dir grad erklärt hat warum das so ist. Du hast ihn wohl nicht verstanden;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

7

29.07.2013, 13:07

Doch, ich habe ihn dabei schon verstanden. Nur nehme ich an, dass er meinte, ich hätte "lua_register" nicht verstanden und hätte ihm falsche Argumente gegeben.

8

29.07.2013, 13:10

Lies es nochmal. Du hast den Unterschied zwischen normaler und statischer Memberfunktion nicht verstanden.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

9

29.07.2013, 13:17

Oh Okay.
Hab das Problem jetzt dadurch gelöst, dass ich den Zeiger auf die Klasse an die statische Funktion übergebe.

Danke für die Antworten :)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

29.07.2013, 13:19

Wobei du überlegen kannst die Funktion komplett von der Klasse zu entkoppeln. Also als nicht statische nicht Member Funktion.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige