![]() |
Pointer auf Array ?
Hallo DPler,
ich empfange über eine Schnittstelle einen String, der nach einem festen Protokoll aufgebaut ist. Um möglichst schnell und effektiv zu sein benutze ich Pointer, um verschiedene Typen aus diesem String zu holen/darauf zu verzeigern (Byte, Real, etc. -Werte). Das funktioniert auch einwandfrei; allerdings kommt u.A. auch ein 128bit breites Array von Bits (Boolean) hinzu. Klar könnte ich auch 16 Byte nehmen aber ich möchte, wie im Protokoll auch ein Array of Boolean haben. Was mache ich falsch ? Es steht nur "Mist", im Array, der Pointer zeigt irgendwohin im Speicher aber nicht auf mein Ziel. Hier ein Schnipsel, um das zu verdeutlichen :
Code:
Type TStatus = Array[1..128] of Boolean;
Var s, s2 : String; i : Integer; Status : TStatus; PStatus : ^TStatus; PLength : PByte; begin s := #$00#$00#$00#$00#$08#$04#$02#$01#$00#$00#$00#$00#$08#$04#$02#$01; PLength := @s[7]; ShowMessage(IntToStr(PLength^)); //Ergebnis = 2, stimmt PStatus := @s[1]; Status := pStatus^; (*Debugausgabe*) s2 := ''; For i:=Low(Status) to High(Status) do Begin If Status[i] then s2 := s2 + '1' Else s2 := s2 + '0'; If (i mod 8) = 0 then s2 := s2 + #32; End; ShowMessage(s2); //Ergebnis falsch end; |
AW: Pointer auf Array ?
Hast Du mal nachgeschaut, wie groß Boolean ist?
|
AW: Pointer auf Array ?
Bin ich doof, logisch es gibt ja gar kein "Bit", das ist mindestens ein Byte im Speicher.
Bleibt mir also nichts, als 16 Bytes zu nehmen und die Bits zu extrahieren oder zu shiften oder sonstwas ? |
AW: Pointer auf Array ?
So würde ich es zumindest machen.
|
AW: Pointer auf Array ?
Danke ! :-)
|
AW: Pointer auf Array ?
Vorschlag auf die Schnelle (s muss BTW ein AnsiString sein):
Delphi-Quellcode:
type
TStatus = Array[1..16] of Byte; Var s, s2 : AnsiString; i, j : Integer; Status : TStatus; PStatus : ^TStatus; PLength : PByte; CurrentBit: Byte; begin s := #$00#$00#$00#$00#$08#$04#$02#$01#$00#$00#$00#$00#$08#$04#$02#$01; PLength := @s[7]; ShowMessage(IntToStr(PLength^)); //Ergebnis = 2, stimmt PStatus := @s[1]; Status := pStatus^; (*Debugausgabe*) s2 := ''; For i := Low(Status) to High(Status) do Begin for j := 7 downto 0 do begin CurrentBit := 1 shl j; if (Status[i] and CurrentBit) = CurrentBit then s2 := s2 + '1' else s2 := s2 + '0'; end; if i < High(Status) then s2 := s2 + #32; End; ShowMessage(s2); end; |
AW: Pointer auf Array ?
Nochmals Danke :-)
Hehe, hatte mir fast die gleiche Lösung überlegt:
Code:
Ich benutze noch Delphi 2005, bei XE(2) ist ein Zeichen eines Strings dann 2 Byte breit (Unicode), deshalb meinst Du AnsiString benutzen oder ?For i:=Low(Status) to High(Status) do Begin For i2 := 7 downto 0 do If (Status[i] AND (1 SHL i2)) <> 0 then s2 := s2 + '1' Else s2 := s2 + '0'; s2 := s2 + #32; End; Noch eine Frage zum ByteBool, wenn ich mehrere Boolsche Variablen in meinem Programm deklariere, kann Delphi dann durch Compilermagic z.B. für 3 Werte trotzdem nur 1 Byte benutzen oder wird auch dann immer ein Byte Speicher verbraucht ? Heutzutage ist es wohl nicht mehr so wichtig*, auf jedes Byte zu achten aber interessieren würde es mich schon. *Ich programmiere auch AVRs, da sieht das etwas anders aus :stupid: |
AW: Pointer auf Array ?
Du kannst natürlich mehrere Booleans als Bitfelder speichern
|
AW: Pointer auf Array ?
Das ist schon klar, das mache ich ja auch, wenn ich bei den 16Byte auf die 128 einzelnen Bits zugreife.
Die Frage ist: Wenn ich eine Boolsche Variable deklariere braucht die ein Byte (ByteBool). Wenn ich nun zwei Boolsche Variablen deklariere, brauchen die nun zwei Byte oder ist der Compiler so klever die in ein Byte zu packen ? Alleine der Pointer auf den Bool dürfte aber unter 32bit 4Byte brauchen. |
AW: Pointer auf Array ?
Eine Booleanvariable belegt ein Byte, da dies die kleinste (Speicher-)Einheit ist
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz