Seite 1 von 1
Teile einer Quad per Poke in den Speicher
Verfasst: 04.11.2019 16:50
von techniker
Hallo,
ich habe hier mehrere Quad-Variablen, welche ein codiertes Bitmuster darstellen.
Ich muss nun die unteren 48 Bit an verschiedene Bereiche per Poke in den Speicher schreiben.
(Das ganze wird ein spezielles Binärdaten-Telegramm, welches anschließend verschickt wird.)
Beispiel:
Code: Alles auswählen
var.q = $123456789ABC
PokeW(*buf + 50, (var & $00000000ffff))
PokeW(*buf + 48, (var & $0000ffff0000) >> 16)
PokeW(*buf + 46, (var & $ffff00000000) >> 32)
Leider funktioniert dies so nicht, da PB wohl Probleme beim casten von Quad nach Word besitzt.
Wie kann ich dies dennoch realisieren?
Danke und schöne Grüße
Re: Teile einer Quad per Poke in den Speicher
Verfasst: 04.11.2019 17:01
von NicTheQuick
Mal 'ne ganz simple Idee, aber ich bin nicht sicher, ob die Reihenfolge damit stimmt:
Re: Teile einer Quad per Poke in den Speicher
Verfasst: 04.11.2019 17:08
von techniker
NicTheQuick hat geschrieben:Mal 'ne ganz simple Idee, aber ich bin nicht sicher, ob die Reihenfolge damit stimmt:
OK, das Beispiel war wohl zu einfach..
Ich habe auch einzelne Bits, welche "wild geschoben" und kopiert werden müssen..
Re: Teile einer Quad per Poke in den Speicher
Verfasst: 04.11.2019 17:18
von NicTheQuick
Unter den Stichworten "setbit" und "getbit" findest du hier im Forum schon gute Codeschnipsel. Möglicherweise ist das dann schon alles, was du brauchst. Hier mal einer der vielen, in dem ich auch selbst mitgewirkt habe:
einzelne Bits schnell lesen / schreiben
Re: Teile einer Quad per Poke in den Speicher
Verfasst: 04.11.2019 17:28
von techniker
Diese Routinen habe ich mir schon angesehen.
Das Ganze wäre dann mehr ein Workaround, statt performanter und effektiver Code.
Eine andere und einfache Möglichkeit (wie z.B. in C) gibt es also wirklich nicht?
Re: Teile einer Quad per Poke in den Speicher
Verfasst: 04.11.2019 17:51
von NicTheQuick
In C kann man sehr gut mit einzelnen Bits arbeiten, wenn man Strukturen verwendet. Das geht so leider nicht in Purebasic.
Aber vielleicht fällt dem einen oder anderen hier ja noch was ein, wenn du ein entsprechendes Beispiel in C zeigen kannst. Oder auch gerne ein ausführbarer Purebasic-Testcode, damit die Helfer hier möglichst wenig Vorarbeit leisten müssen um dir zu helfen.
Re: Teile einer Quad per Poke in den Speicher
Verfasst: 04.11.2019 19:49
von mk-soft
Geht auch einfacher ohne Poke...
Code: Alles auswählen
Structure udtSplitQuad
StructureUnion
a.a[8]
u.u[4]
l.l[2]
q.q
EndStructureUnion
EndStructure
Define qVal.q
Define *qVal.udtSplitQuad
*qVal = @qVal
*qVal\u[0] = $FFFF
Debug qVal
Debug RSet(Hex(qval, #PB_Quad), 16, "0")
Nicht vergessen... Low- Highbyte notation
Somit ist im Speicher das erste Word (*qVal\u[0]) das Low-Word
P.S.
Wenn es ein Protokoll ist, baue dir doch die passende Struktur dafür
Re: Teile einer Quad per Poke in den Speicher
Verfasst: 05.11.2019 00:26
von STARGÅTE
hier mal meine Lösung, die "alle" Probleme wie Sign-Shift usw. bereits gefixt hat:
Structure bitweise füllen / abfragen
GetBit(*Buffer.AllTypes, Position.i, Length.i=1) gibt eine Bit-Sequence der Länge "Length" ab der Position "Position" des Puffers "*Buffers" zurück.
SetBit(*Buffer.AllTypes, Position.i, Value.q, Length.i=1) arbeitet ähnlich.