Seite 1 von 1
DLL-Funktion liefert Pointer auf ein Array - Wie Arr lesen?
Verfasst: 23.08.2006 13:00
von Clipper
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)
Verfasst: 23.08.2006 13:08
von Clipper
Sorry sorry
Ich glaube ich hab es:
valu = CallFunction(0,"funktion",*a,*a,c.s)
Debug PeekS(PeekL(valu))
Verfasst: 23.08.2006 13:57
von inc.
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 ...
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]
Verfasst: 23.08.2006 14:29
von ts-soft
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]
Wenn man Prototypes verwendet, was ich nur empfehlen kann, ist dies doch auch überflüssig. Jedenfalls das OT-Beispiel.
Verfasst: 23.08.2006 15:38
von MVXA
Und ich kann nur von Prototypen abraten, da diese den Stack zerhauen
könnten. Das Problem hatte ich zumindest mal. Hab mir dann natürlich
nen Wolf gesucht, bis ich den Fehler hatte.
Verfasst: 23.08.2006 15:41
von inc.
Ich kenne mich mit Prototypen noch nicht so aus, bis auf jene Beispiele um Functionen in Structuren nutzen zu können ....
@TS-Soft & MVXA
Könntet Ihr mal zu euren Angaben Beispiele posten? Thx.
Verfasst: 24.08.2006 06:42
von Clipper
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:
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
Dein Beispiel habe ich umgebaut zu:
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
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!.
Verfasst: 24.08.2006 09:14
von inc.
Da ein Stringelement in einer Struktur eh lediglich nur den pointer! zu jenem string besitzt, ist der Code oben von mir genau richtig, denn so musst du nicht 'peek'en'
Verfasst: 24.08.2006 10:13
von Clipper
inc, du hast Recht! Ich hab noch einmal alles überprüft. Es läuft super.
Ich danke Dir !!!!
