Mit C++ auf BB Banks zugreifen?

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: Mit C++ auf BB Banks zugreifen?

BeitragFr, Jun 25, 2010 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit C++ auf BB Banks zugreifen?
Wie genau geht das? (Und ich frage hier, weil es hier C++ Programmierer gibt, die BB kennen.)
Ich versuche nämlich parameter zu sparen indem ich die durch eine Bank an den Wrapper schicke der dadurch dann alles herausfinden kann(besonders bei VertexArrays)

Farbfinsternis

BeitragFr, Jun 25, 2010 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
schreibe in Deine DECLS ein * als Datentyp und kopiere die Bank in ein Type. Alternativ übergibst Du das Handle der Bank und liest es so aus. Das ist aber extrem unelegant. Es ist hin und wieder notwendig in BB Speicher zu kopieren wenn C++ ein Struct zurückgibt, im umgekehrten Fall genügt der Zeiger auf Type.
Farbfinsternis.tv

Xaymar

ehemals "Cgamer"

BeitragFr, Jun 25, 2010 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
äh was? Ich glaube du hast mich andersrum verstanden.

1. Ich will mit C++ auf eine BB Bank zugreifen, nicht andersrum
2. Der * Parameter bringt ja nur das ich beliebige sachen übergeben kann.

Thunder

BeitragFr, Jun 25, 2010 21:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Achtung! Das ist ungetestetes Halbwissen: Wenn du mit dem * Operator eine Bank an eine C/C++ Funktion übergibst, kannst du sie wie einen Zeiger handhaben:

Code: [AUSKLAPPEN]
int getFirstInt(void *ptr){
    return *((int*) ptr);
}



mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Noobody

BeitragSa, Jun 26, 2010 2:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Banks übergeben ist an sich relativ simpel. Wie bruZard schon erwähnte, muss man in der Decls den Parameter als * angeben Code: [AUSKLAPPEN]
.lib "MeineTolleDLL.dll"

TolleFunktion%( Bank* ):"_TolleFunktion@4"


In C++ sähe die entsprechende Funktion dann so aus Code: [AUSKLAPPEN]
//In VisualC++ musste ich _stdcall in __stdcall abändern, da sich sonst der Compiler beschwerte
//Ob das bei dir vonnöten ist, muss du ausprobieren
extern "C" _declspec(dllexport) int _stdcall TolleFunktion( void* Bank ) {
   return *(int*)Bank; //Liefert die ersten 4 Bytes der Bank als Int zurück
}

Der BB-Code sähe dann so aus BlitzBasic: [AUSKLAPPEN]
Local Bank = CreateBank( 4 )

PokeInt Bank, 0, 1337

Print TolleFunktion( Bank )

WaitKey()
End

Du kannst übrigens auch Types übergeben, das kann je nach dem auch nützlich sein.

Wenn du in C++ viele Parameter bearbeiten willst, kannst du ausserdem die Bank in einen Struct-Pointer umcasten. Das macht das Bearbeiten dann leichter, da du nicht mehr auf Indizes zugreifst, sondern auf benannte Felder Code: [AUSKLAPPEN]
struct Parameter {
   int Foo;
   float Bar;
   unsigned char Fubar;
   //Etc. etc.
};

extern "C" _declspec(dllexport) float _stdcall TolleFunktion( void* Bank ) {
   Parameter* P = (Parameter*)Bank;

   return ( Parameter->Foo + Parameter->Fubar )*Parameter->Bar;
}

Das setzt aber voraus, dass du das Format der Bank kennst und sich dieses nicht zwischen Funktionsaufrufen ändert.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Xaymar

ehemals "Cgamer"

BeitragSa, Jun 26, 2010 3:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok das klärt dann alles. Vielen dank.

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group