Struktur eines Types?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

hamztata

Betreff: Struktur eines Types?

BeitragMi, März 11, 2009 3:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 11, 2009 8:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 11, 2009 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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.
 

Ava

Gast

BeitragMi, März 11, 2009 17:27
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

BeitragMi, März 11, 2009 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 11, 2009 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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?

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group