Struktur eines Types?
Übersicht

hamztataBetreff: Struktur eines Types? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nehmen wir an, man will an eine geladene *.dll einen kompletten Typesatz weitergeben.
Dieser Typesatz muss ja irgendwie ausgelesen werden. Wie werden also innerhalb eines Types die sagen wir Eigenschaften gespeichert, um diese auch auslesen zu können? Ich weiß, das ist jetzt schwer zu erklären. Code: [AUSKLAPPEN] Type Irgendwas
Field a% Field b% Field c% End Type Global I_Irgendwas.Irgendwas = New Irgendwas Function Blubblub% (I_Irgendwas, haste%, nich%, gesehen%) code Return End Function I_Irgendwas muss ja nun irgendwie auch ausgelesen werden können, oder? |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du in deiner .decls den Stern * hinter dem Parameter angegeben hast, übergibt Blitz den Zeiger auf das Objekt.
Jetzt musst du in deiner DLL den Type auch definiert haben (als Struct oder was auch immer), so dass er exakt deckungsgleich mit dem Type in Blitz ist. Dann kannst du ganz normal den Type auslesen, der jetzt ja ein gewöhnlicher Struct - Zeiger ist (alternativ ginge auch ein void - Zeiger, den du dann je nach dem castest, aber das ist relativ unschön). Wenn du an eine DLL einen Type oder eine Bank übergeben willst, musst du in der .decsl zu deiner DLL folgendes angeben: Code: [AUSKLAPPEN] .lib "MeineTolleDLL.dll"
DLLFunktion%( Type* ) Der Stern (*) kennzeichnet nämlich, dass Blitz hier den Zeiger auf das Objekt übergeben muss - in deiner DLL würde nun folgendes stehen (C - Code) Code: [AUSKLAPPEN] struct Irgendwas {
int A; int B; int C; } int DLLFunktion( Irgendwas* TypeInstanz ) { return TypeInstanz->A; } In Blitz könntest du die Funktion wie folgt aufrufen: Code: [AUSKLAPPEN] Type TIrgendwas
Field A Field B Field C End Type Irgendwas.TIrgendwas = New TIrgendwas Irgendwas\A = 25 Print DLLFunktion( Irgendwas ) |
||
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 |
hamztata |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
so dachte ich mir das ja auch.
wie genau würde der C code aussehen, um in einer DLL einen kompletten übergebenen Type abzufragen? So wie in Deinem Beispiel? Aber da wird ja glaub ich nur auf A eingegangen. Also nehmen wir ein Type an, mit drei Mitgliedern von jeweils unterschiedlichem Datentyp. Könntest Du, oder jemand anderes mir diesen C code schreiben. Wäre sehr hilfreich. Danke sehr. Oder nehmen wir an, wir haben solch eine dll, welche ein Type erwartet. Kann man solch ein Type auch exact nachbauen und übergeben, ohne Type selbst zu nutzen? Grund ist folgender. Habe eine DLL, welche eben in genau einer Funktion einen Type mit drei Werten an die DLL übergibt. Ich möchte nebenbei diese DLL aber auch noch in einer anderen Sprache nutzen als BB. Diese hat zwar Types, aber deren genaue Art der Übergabe kenne ich nicht. Also überlege ich, wie man diese Typeübergabe mittels Workaround anderweitig bewerkstelligen könnte. Vielleicht mit Banken? Es muss halt für die DLL wie ein Type ausschauen, wenn es übergeben wird. |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Warum benötigst Du denn das Objekt ?
Du sagst, Dein Objekt hat drei Werte. Was spricht dagegen, diese drei als Einzelvariablen zu übergeben? |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da ein Type nur ein Zeiger auf ein Stück Speicher ist, kannst du genauso gut eine Bank übergeben (welche für die DLL auch nur ein Zeiger auf ein Stück Speicher ist).
Wenn du also die Daten richtig hineinschreibst, dann sollte das keine Probleme bereiten. Zu deiner Frage mit den Datentypen: Voilà Code: [AUSKLAPPEN] struct Irgendwas {
int A; float B; } float DLLFunktion( Irgendwas* TypeInstanz ) { return ((float)TypeInstanz->A)/TypeInstanz->B; } Code: [AUSKLAPPEN] Type TIrgendwas
Field A Field B# End Type Bank = CreateBank( 8 ) PokeInt Bank, 0, 25 PokeFloat Bank, 4, 3.141 Irgendwas.TIrgendwas = New TIrgendwas Irgendwas\A = 25 Irgendwas\B# = 3.141 Print DLLFunktion#( Irgendwas ) Print DLLFunktion#( Bank ) ;Liefert beides dasselbe Resultat zurück Strings funktionieren nicht, da der Blitz - String mehr ist als nur ein Char - Array. Ebenso brauchst du für Blitzarrays und Verweise auf andere Types einen Workaround. Falls du mehr Felder im Type hast - kein Problem. Solange das Struct in der DLL gleich aufgebaut ist wie der Type (oder halt die Bank), kannst du mit ganz normalen C - Methoden die Daten holen. |
||
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 |
hamztata |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
OKAY will das mal mit banken probieren, du hast bei dir aber FLOAT und INT drin.
Ich brauch aber auf jeden Fall noch ein ARRAY[256] Kann man das da auch einbauen? problem ist, die dll existiert bereits schon. ich möchte die aber auch mit einer anderen sprache nutzen. und an diese dll wird in einem befehl, also einer gewrappten funktion eben so ein type übergeben. und ich müßte wissen, wie nun die type struktur in c aussehen würde. damit ich bei der anderen sprache weiß, was die dll erwartet und in welcher form Code: [AUSKLAPPEN] xCreateImageEx_% (texures*, width%, height%, flags%) : "CreateImageEx_"
Type FI_SurfacesType Field Count% Field Array%[256] Field Texture% End Type Global FI_Surfaces.FI_SurfacesType = New FI_SurfacesType Function xCreateImageEx% (texture%, width%, height%, imageFlags%=FI_AUTOFLAGS) If texture<>0 Then FI_Surfaces\Texture = texture FI_Surfaces\Count = xGetTextureFrames(texture) If FI_Surfaces\Count>0 Then If FI_Surfaces\Count>256 Then FI_Surfaces\Count=256 For i=0 To FI_Surfaces\Count-1 FI_Surfaces\Array[i] = xGetTextureSurface(texture, i) Next Return xCreateImageEx_(FI_Surfaces, width, height, imageFlags) EndIf EndIf Return 0 End Function Wie wird FI_Surfaces gelesen? Wie sieht das in C aus, was da ankommt, und erwartet wird? hab ich das einigermaßen gut erklärt? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group