uint32_t zu int beim wrappen einer C-Funktion

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Stevie63
Beiträge: 86
Registriert: 06.05.2009 23:02
Computerausstattung: Win 10, i7, fsc celsius

uint32_t zu int beim wrappen einer C-Funktion

Beitrag von Stevie63 »

Hallo zusammen,

eine C-Funktion hat einen Parameter vom Typ uint32_t * (ptr auf unsigned integer, 32 bit)

Wenn jetzt der Wert, den ich auslesen will, größer als 2147483647 ist (lese mit PeekI aus), dann erhalte ich einen negativen Wert (Klar.)

Um jetzt aber den wahren Wert zu erhalten, haben ich mir folgenden Weg ausgedacht:

Bsp:

Code: Alles auswählen

EnableExplicit

Define a.i = 2147483647+10
Define b.q
Define v.s

Debug a
Debug RSet(Bin(PeekI(@a),#PB_Long), 32, "0")
v.s = "%" + RSet(Bin(PeekI(@a),#PB_Long), 32, "0")
Debug v
b = Val(v)
Debug b

Der Wrapper würde dann entsprechend so aussehen (aufs notwendigste gekürzt):

Code: Alles auswählen

Procedure.q wrapfunc ( *p ) ; Die C-Funktion hat analog uint32_t *ptr
	ProcedureReturn Val("%" + RSet(Bin(PeekI(*p),#PB_Long), 32, "0"))
EndProcedure

Meine Frage: Weiß jemand einen eleganteren Weg?

Viele Grüße

Stevie63

Ich vergaß: Hab's unter x86 getestet, unter x64 sollte ich PeekL statt PeekI nehmen. Evtl muß auch noch überprüft werden, ob der ausgelesene Wert negativ oder positiv ist. Bei positiv kann ich mir ja die Konvertiererei sparen.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: uint32_t zu int beim wrappen einer C-Funktion

Beitrag von Danilo »

Stevie63 hat geschrieben:Wenn jetzt der Wert, den ich auslesen will, größer als 2147483647 ist (lese mit PeekI aus), dann erhalte ich einen negativen Wert (Klar.)
Beim PeekL direkt nach Quad?

Code: Alles auswählen

EnableExplicit

Define a.l = 2147483647+10
Define q.q = PeekL(@a) & $FFFFFFFF

Debug a
Debug q
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Stevie63
Beiträge: 86
Registriert: 06.05.2009 23:02
Computerausstattung: Win 10, i7, fsc celsius

Re: uint32_t zu int beim wrappen einer C-Funktion

Beitrag von Stevie63 »

Danilo hat geschrieben:
Stevie63 hat geschrieben:Wenn jetzt der Wert, den ich auslesen will, größer als 2147483647 ist (lese mit PeekI aus), dann erhalte ich einen negativen Wert (Klar.)
Beim PeekL direkt nach Quad?

Code: Alles auswählen

EnableExplicit

Define a.i = 2147483647+10
Define q.q = PeekL(@a) & $FFFFFFFF

Debug a
Debug q
Hallo Danilo,

einfach und perfekt!

Vielen Dank!

Stevie63
Benutzeravatar
mk-soft
Beiträge: 3902
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: uint32_t zu int beim wrappen einer C-Funktion

Beitrag von mk-soft »

Alles quatsch den Wert von 32 Bitwert in einen 64 Bitwert zu wandeln.

Beim rechnen von 32bit werten ist völlig uninteresant ob dieser Wert als Int (PB_Long) oder UInt definiert ist. Das Über- Unterlaufbit wird so wie so ignoriert.

Für die Ausgabe als Text gibt es in PB die Funktion StrU(...) um ein Wert Unsigned auszugeben.

Das einzige was man beachten muss, das PB den Wert als Signed vergleicht.
Dafür habe ich schon vor längere Zeit Funktionen für UnsignedCompare in Forum gestellt.

http://www.purebasic.fr/german/viewtopi ... 9&p=277435

Michael
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Stevie63
Beiträge: 86
Registriert: 06.05.2009 23:02
Computerausstattung: Win 10, i7, fsc celsius

Re: uint32_t zu int beim wrappen einer C-Funktion

Beitrag von Stevie63 »

mk-soft hat geschrieben:Alles quatsch
Michael
Und was ist jetzt an der Lösung von Danilo so "Alles quatsch"?

Sie funktioniert einfach.

Viele Grüße

Stevie63
Antworten