DLL-Funktion liefert Pointer auf ein Array - Wie Arr lesen?
DLL-Funktion liefert Pointer auf ein Array - Wie Arr lesen?
Hallo,
ich benutze per CallfunctionFast eine Funktion einer Lib, die mir eine
null-terminierte Liste mit Pointern auf Werte zurückgibt.
Wenn ich die Werte lesen will, geht das in C so:
char **vals;
if ( ( vals = funktion( a,b,c ) ) != NULL ) {
for ( i = 0; vals != NULL; i++ ) {
printf( "%s: %s\n", a, vals );
}
Wie bekomme ich das in PB hin??
(Die Anzahl der Werte weiss ich nicht im Vorraus)
ich benutze per CallfunctionFast eine Funktion einer Lib, die mir eine
null-terminierte Liste mit Pointern auf Werte zurückgibt.
Wenn ich die Werte lesen will, geht das in C so:
char **vals;
if ( ( vals = funktion( a,b,c ) ) != NULL ) {
for ( i = 0; vals != NULL; i++ ) {
printf( "%s: %s\n", a, vals );
}
Wie bekomme ich das in PB hin??
(Die Anzahl der Werte weiss ich nicht im Vorraus)
Dadurch erhälst du aber lediglich den Pointer zum ersten Element jenes "char **vals" Arrays im C Code.
Hmmmm ..... mal nur so ausm Kopf, keine Gewähr ...
[OT]
PS: Somit könnte man sich viell. auch generell das PeekS() bei Stringrückgaben aus Dlls sparen:
*ResultedString.String = DllFunction()
Debug *ResultedString\s
[\OT]
Hmmmm ..... mal nur so ausm Kopf, keine Gewähr ...
Code: Alles auswählen
structure myString
s.s[0]
EndStructure
i.l = 0
*valu.myString = CallFunction(0,"funktion",*a,*a,c.s)
While *valu\s[i]
Debug *valu\s[i] ; < ---- Kein Peek sondern direkte String-via-pointer Abfrage
i+1
Wend
[OT]
PS: Somit könnte man sich viell. auch generell das PeekS() bei Stringrückgaben aus Dlls sparen:
*ResultedString.String = DllFunction()
Debug *ResultedString\s
[\OT]
Hier gibts die OOP Option für PureBasic.
- 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
Wenn man Prototypes verwendet, was ich nur empfehlen kann, ist dies doch auch überflüssig. Jedenfalls das OT-Beispiel.inc. hat geschrieben: [OT]
PS: Somit könnte man sich viell. auch generell das PeekS() bei Stringrückgaben aus Dlls sparen:
*ResultedString.String = DllFunction()
Debug *ResultedString\s
[\OT]
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Hallo inc, du hast natürlich Recht, ich bekomme nur den Zeiger auf das erste Listenelement.
Die Liste ist eine Liste von Pointern auf Strings.
So funktioniert es dann:
Dein Beispiel habe ich umgebaut zu:
Das läuft soweit bis irgendwann die Fehlermeldung Pointer ist null ausgegeben wird und zwar in der Zeile "While *apt\l" !??
PeekS() kann ich wahrscheinlich auch weglassen wenn ich mit MyString arbeite!.
Die Liste ist eine Liste von Pointern auf Strings.
So funktioniert es dann:
Code: Alles auswählen
pt.l=CallFunction(0,"funktion",*a,*a,c.s)
If pt
ptp.l=PeekL(pt)
While ptp
ptp.l=PeekL(pt)
If ptp
Debug PeekS(ptp)
pt+4 ; = sizeof(LONG)
EndIf
Wend
EndIf
Code: Alles auswählen
Structure myLong
l.l[0]
EndStructure
*valu.myLong=CallFunction(0,"funktion",*a,*a,c.s)
i=0
While *valu\l[i]
Debug PeekS(*valu\l[i])
i+1
Wend
PeekS() kann ich wahrscheinlich auch weglassen wenn ich mit MyString arbeite!.