PureBoard
http://forums.purebasic.com/german/

Teile einer Quad per Poke in den Speicher
http://forums.purebasic.com/german/viewtopic.php?f=3&t=31710
Seite 1 von 1

Autor:  techniker [ 04.11.2019 16:50 ]
Betreff des Beitrags:  Teile einer Quad per Poke in den Speicher

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:
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

Autor:  NicTheQuick [ 04.11.2019 17:01 ]
Betreff des Beitrags:  Re: Teile einer Quad per Poke in den Speicher

Mal 'ne ganz simple Idee, aber ich bin nicht sicher, ob die Reihenfolge damit stimmt:
Code:
var.q = $123456789ABC

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

Autor:  techniker [ 04.11.2019 17:08 ]
Betreff des Beitrags:  Re: Teile einer Quad per Poke in den Speicher

NicTheQuick hat geschrieben:
Mal 'ne ganz simple Idee, aber ich bin nicht sicher, ob die Reihenfolge damit stimmt:
Code:
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..

Autor:  NicTheQuick [ 04.11.2019 17:18 ]
Betreff des Beitrags:  Re: Teile einer Quad per Poke in den Speicher

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

Autor:  techniker [ 04.11.2019 17:28 ]
Betreff des Beitrags:  Re: Teile einer Quad per Poke in den Speicher

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?

Autor:  NicTheQuick [ 04.11.2019 17:51 ]
Betreff des Beitrags:  Re: Teile einer Quad per Poke in den Speicher

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.

Autor:  mk-soft [ 04.11.2019 19:49 ]
Betreff des Beitrags:  Re: Teile einer Quad per Poke in den Speicher

Geht auch einfacher ohne Poke...
Code:
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

Autor:  STARGÅTE [ 05.11.2019 00:26 ]
Betreff des Beitrags:  Re: Teile einer Quad per Poke in den Speicher

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.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/