Teile einer Quad per Poke in den Speicher

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Teile einer Quad per Poke in den Speicher

Beitrag 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
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Teile einer Quad per Poke in den Speicher

Beitrag 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)
Bild
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Teile einer Quad per Poke in den Speicher

Beitrag 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..
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Teile einer Quad per Poke in den Speicher

Beitrag 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
Bild
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Teile einer Quad per Poke in den Speicher

Beitrag 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?
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Teile einer Quad per Poke in den Speicher

Beitrag 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.
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Teile einer Quad per Poke in den Speicher

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Teile einer Quad per Poke in den Speicher

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten