Freebasic "zstring ptr" was in Purebasic?

Fragen zu allen anderen Programmiersprachen.
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Freebasic "zstring ptr" was in Purebasic?

Beitrag 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é
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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:

Code: Alles auswählen

PrototypeC Caller(String.s)
PB übergibt automatisch den Pointer.


Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag 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:

Code: Alles auswählen

texture01.l = nLoadTexture("media/mur_Ambiant.jpg")
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.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Hm. Komisch ich hab jetzt noch ein bisschen mehr nachgelesen:
http://www.freebasic-portal.de/index.php?s=reftopic&id=60 hat geschrieben:[...] wurde er als null-terminierter STRING festgelegt, d.h. er endet bei dem Zeichen CHR(0)
> 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
Zuletzt geändert von cxAlex am 13.07.2009 10:52, insgesamt 1-mal geändert.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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")
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

PrototypeC.l ProtonLoadTexture(*filename.i) 
Was macht das .i hinter dem Pointer? :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

*achselzuck* ich arbeite nicht täglich mit pointern. soll da garkein typ dran?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
real
Beiträge: 468
Registriert: 05.10.2004 14:43

Beitrag von real »

Code: Alles auswählen

PrototypeC.l ProtonLoadTexture(*filename.s)
in Verbindung mit

Code: Alles auswählen

texture01.l = nLoadTexture(@"media/mur_Ambiant.jpg")
bringen ebenfalls einen Fehler beim Speicherzugriff...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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

Code: Alles auswählen

PrototypeC.l ProtonLoadTexture(*filename.s)
*filename.s ist total falsch. Entweder *filename oder filename.s

Wird hoffentlich bald vom Compiler angemeckert, kann das nicht mehr sehen :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten