Seite 1 von 2
Freebasic "zstring ptr" was in Purebasic?
Verfasst: 05.07.2009 21:07
von real
Hi,
der Titel sagt eigentlich alles. Ich möchte einen Freebasic-Quellcode nach Purebasic konvertieren und bin jetzt auf einen "zstring ptr" gestossen, der von einer DLL als Parameter erwartet wird. Was muss ich der DLL in Purebasic übergeben, damit ich keinen fehlerhaften Speicherzugriff erzeuge? Und wie muss ich meinen PrototypeC definieren, damit die Deklaration der "zstring ptr"-Deklaration aus Freebasic entspricht?
Gruß
René
Verfasst: 05.07.2009 21:11
von cxAlex
http://de.wikibooks.org/wiki/FreeBasic:_Pointer#ZString
Ein ZString ist also mehr oder weniger ein Pointer auf ein UByte-Array.
UByte = Character
Dim a(0 to 9) as ubyte
Wobei a(9) immer 0 ist, weil ja ein ZString immer mit einem Chr(0) endet.
Also einfach ein Null-Terminierter String.
Einfach @String.s in Purebasic und die Sache hat sich.
PureBasic Democode:
PB übergibt automatisch den Pointer.
Gruß, Alex
Verfasst: 06.07.2009 13:24
von real
Den Wikieintrag hatte ich mir durchgelesen, trotzdem bekomme ich es nicht hin... Nochmal konkreter: Ich versuche, für Ninfa3D ein Include für Purebasic zu erzeugen und scheitere mit einem
"[ERROR] Invalid memory access. (read error at address 0)".
Das Freebasic-Include sieht an der Stelle wie folgt aus:
Code: Alles auswählen
Type nTEXTURE As Uinteger Ptr
Declare Function LoadTexture Cdecl Alias "LoadTexture" (Byval filename As Zstring Ptr) As nTEXTURE
Mein Purebasic-Include sieht dazu sieht wie folgt aus:
Code: Alles auswählen
PrototypeC.l ProtonLoadTexture(filename.s)
Global nLoadTexture.ProtonLoadTexture = GetFunction(1,"LoadTexture")
Mein Purebasic-Test-Programm ruft folgendes auf:
Wenn ich den Textur-Namen mit @"media/mur_Ambiant.jpg" übergebe kommt lediglich die Fehlermeldung, die Funktion würde einen String erwarten.
Das die dll mit OpenLibrary(1,"ninfa3d.dll" korrekt geöffnet wird prüfe ich natürlich vorher.
Verfasst: 06.07.2009 13:35
von cxAlex
Hm. Komisch ich hab jetzt noch ein bisschen mehr nachgelesen:
> Byval filename As Zstring Ptr
Zstring Ptr müsste ein Pointer auf einen Zstring sein, und das PB - Äqivalent ist eben String, korrekt wäre eben @String.s. Kann es sein das die Funktion einen Unicode-String erwartet, sonst gehen mir die Ideen aus?
Gruß, Alex
Verfasst: 06.07.2009 13:36
von Kaeru Gaman
da ein Pointer erwartet wird, probier mal
Code: Alles auswählen
PrototypeC.l ProtonLoadTexture(*filename.i)
Global nLoadTexture.ProtonLoadTexture = GetFunction(1,"LoadTexture")
texture01.l = nLoadTexture(@"media/mur_Ambiant.jpg")
Verfasst: 06.07.2009 16:45
von ts-soft
Was macht das .i hinter dem Pointer?

Verfasst: 06.07.2009 17:21
von Kaeru Gaman
*achselzuck* ich arbeite nicht täglich mit pointern. soll da garkein typ dran?
Verfasst: 06.07.2009 17:22
von real
in Verbindung mit
bringen ebenfalls einen Fehler beim Speicherzugriff...
Verfasst: 06.07.2009 17:29
von ts-soft
Kaeru Gaman hat geschrieben:*achselzuck* ich arbeite nicht täglich mit pointern. soll da garkein typ dran?
Richtig!
Ein Pointer hat keinen nativen Typen! Man kann lediglich eine Strukture
angeben um einen strukturierten Pointer zu erhalten.
.i, .l, .s, .w usw. sind keine Strukturen.
@real
*filename.s ist total falsch. Entweder *filename oder filename.s
Wird hoffentlich bald vom Compiler angemeckert, kann das nicht mehr sehen

Verfasst: 06.07.2009 17:46
von Kaeru Gaman
>> Man kann lediglich eine Strukture angeben um einen strukturierten Pointer zu erhalten.
also in dem Fall garnix, weil Structs als Parameter nicht akzeptiert werden.