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:

Code: Alles auswählen

var.q = $123456789ABC

CopyMemory(@var, *buf + 46, 6)

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:

Code: Alles auswählen

var.q = $123456789ABC

CopyMemory(@var, *buf + 46, 6)
OK, das Beispiel war wohl zu einfach.. :wink:

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.