Habe ein Problem.
Und zwar kann ich Newton keine Procedure einer Klasse als ForceAndTorqueCallback geben.
Muss ich aber, da ich eine Geschwindigkeit speichern möchte (Y den fall) weil Newton hat keine schwerkraft oder so?!
Nunja, dann möchte eben im Callback einmal YWert vergrößern um 9,81 und mit der masse multiplizieren.
Jemand ne andere Idee, wies geht?
Weil ich kann ja sonst net auf die richtigen privaten variablen zugreifen.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Die Callbacks in Newton sind doch eigentlich alle global, also machts keinen Sinn Klassenmethoden zu benutzen (was vom Design her AFAIK auch nicht geht, liegt wohl daran dass Newton C ist).
Registriert: Di Jul 01, 2003 18:59 Beiträge: 887 Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
The thing is that a function or a procedure is different inside a class. I had the same thing when assigning a class procedure to lua. That just does not work. Even inside delphi a class procedure is unequal to a normal procedure as it seems to me.
to solve that i use normal procedure that access the class procedure, i do not know if it also applies to your case but have a look how i solved it for lua: http://www.noeska.com/dlua/downloads.aspx
Das Problem ist, dass Methoden von Delphi (und übrigens auch C++) Klassen einen impliziten zusätzlichen Parameter haben (self unter Delphi), mit dem die aktuelle Instanz und in weiterer Folge die VMT aufgelöst wird. Da die Umsetzung dieses zusätzlichen Parameters (in einem Register, auf dem Stack) ohnehin von der Programmiersprache abhängig ist, macht es auch keinen Sinn, Klassenmethoden eine bestimmte Aufrufkonvention zuzuordnen (wie etwa stdcall), da spätestens bei der Auflösung einer virtuellen Methode Code einer "fremden" Programmiersprache ohnehin den Geist aufgibt.
Aus diesem Grund haben sämtliche Bibliotheken mit guter Cross-Kompilerunterstützung (wie OpenGL) eine rein prozedurale API (was nichts darüber aussagt, ob objektorientiert programmiert wurde oder nicht) - und aus dem selben Grund hat Microsoft eine objektorientierte Schnittstelle direkt ins Betriebssystem ausgelagert (OLE), wodurch man solche Objekte zwar unabhängig von der Programmiersprache ansprechen kann, was aber andere Probleme mit sich bringt (Performance, mangelnde Unterstützung alternativer OS).
In der VCL gibt es ja das gleiche Problem mit der Fensterfunktion. Dort wird dann ein kleiner Buffer mit dem entsprechenden Befehlen (pop ecx,jmp @method) belegt und als Addresse die Addresse des Buffers übergeben. Das geschieht über die Funktionen MakeObjectInstance und FreeObjectInstance. Wer den VCL Quellcode hat, kann sich das in der unit forms.pas ansehen.
Dieses Thema wurde aber bereits schonmal im Forum erläutert:
viewtopic.php?t=2691&highlight=makeobjectinstance
Ja, ich muss allse umwerfen und umschreiben.
Denn die Klasse ist in einem Array und ich weiß nie welche Klassenprocedure ich dann aufrufen muss, nur im create weiß ich das ^^
Naja gut. alles umwerfen.
(Ist wenn man net nachdenkt *gr*)
Mitglieder in diesem Forum: 0 Mitglieder und 3 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.