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

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

11

31.08.2009, 19:26

Zitat von »"Databyte"«

Hehe drakon.. schön wärs :) aber wie man an den spartanischen namen wie "test", "Hallo" etc vtl hätte sehen können ;)
handelt es sich hierbei nur um ein testprogramm (ein modellversuch sozusagen ;))


Dan schildere dein eigentliches Problem mal. Ich denke, dass man das besser Lösen kann.

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

12

31.08.2009, 19:35

Jo..hmmm ich bau gerade nen kleinen wrapper für Squirrel.
Und ich möchte ihm jetzt über eine art userdata die memberfunktion übergeben...
Das Problem dabei ist, das er das ganze als void* haben möchte...
also ist es natürlich am einfachsten und auch am performantesten, einfach den
zeiger direkt zu übergeben....
und zwar mit nem cast zu void*
funktioniert nur leider nicht :)
( also wenn ich den weg von Gotbread schon... aber ich hab meine Zweifel, ob das so ganz sauber ist ;) )

13

31.08.2009, 19:36

Zitat von »"Databyte"«

@Gotbread
Das ist auch meine jetztige lösung... das problem ist dabei nur, dass ich nicht weiß
wie sicher das ganze ist...

einfach von und zu void* zu casten ist auch alles andere als Typsicher...

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

14

31.08.2009, 19:38

Zitat von »"PCShadow"«

Zitat von »"Databyte"«

@Gotbread
Das ist auch meine jetztige lösung... das problem ist dabei nur, dass ich nicht weiß
wie sicher das ganze ist...

einfach von und zu void* zu casten ist auch alles andere als Typsicher...


Jop aber ich habe dabei ein besseres Gefühl :) hehe
Ne wie schon gesagt, werde ich dass noch über ne ander Klasse machen...

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

15

31.08.2009, 20:14

prinzipiell ist das unsicher, da aber bisher alle kompiler die ich getestet
habe memberpointer und voidpointer der selben größe besaßen, sehe
ich darin nur ien theroetisches problem. der msvc erlaubt mir sogar
memberpointer auf virtuelle funktionen zu bilden (intern eine stub-funktion).

ein

C-/C++-Quelltext

1
static_assert(sizeof(void*) == sizeof((void)(test::*)()));


sollte eigentlich den rest absichern (ka ob der memberpointer richtige syntax hat :roll: )
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

16

31.08.2009, 21:05

Zitat von »"Databyte"«

Jo..hmmm ich bau gerade nen kleinen wrapper für Squirrel.
Und ich möchte ihm jetzt über eine art userdata die memberfunktion übergeben...
Das Problem dabei ist, das er das ganze als void* haben möchte...
also ist es natürlich am einfachsten und auch am performantesten, einfach den
zeiger direkt zu übergeben....
und zwar mit nem cast zu void*
funktioniert nur leider nicht :)
( also wenn ich den weg von Gotbread schon... aber ich hab meine Zweifel, ob das so ganz sauber ist ;) )

Jenachdem was du vor hast könnte eine Kombination aus Interface und Template Klasse helfen.
Wie wäre es mit einem Konstrukt dieser Art:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct MyInterface
{
    virtual void CallMyFunction(int param) = 0;
}

template<typename T> class MyImpl : public MyInterface
{
public:
    T* instance;
    MyImpl(T* instance) : instance(instance) {}
    virtual void CallMyFunction(int param) { Mach was mit instance }

}

MyInterface* userdata = new MyImp<MyType>(instance);
userdata->CallMyFunction();

So kannst du unabhängig vom Typ T auf CallMyFunction zugreifen. Hat sich mir schon öfters als praktisch erwiesen.

PS: Ich habe mal nen wrapper code generator für squirrel geschrieben. Ist schon wirklich lang her (und vermutlich auch nimmer aktuell), aber ich kanns dir gerne zukommen lassen.

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

17

31.08.2009, 21:25

Evtl schaust du dir mal den Source von libsigc++ an. Das ist eine Callbacklibrary für C++. Zum Lernen/Lesen auf jedenfall nicht schlecht, das könnte mit etwas Motivation dein Problem lösen oder du verwendest sie gleich, weil sie dir gefällt ;-). Ich muss ehrlich zugeben, dass ich mir noch keine großen Gedanken gemacht habe, wie sie funktioniert obwohl ich sie sehr gerne verwende (BlackBox).

Socke

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

18

31.08.2009, 21:34

@xardias:

Das meinte ich mit :):

Zitat von »"DataByte"«

Naja wenn das nich geht muss ich wohl was serialisierungs-mäßiges Proggen.... :)


trotzdem danke ;)

Werbeanzeige