Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Pointer auf Array ? (https://www.delphipraxis.net/163666-pointer-auf-array.html)

eric_draven 10. Okt 2011 13:14


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;

DeddyH 10. Okt 2011 13:20

AW: Pointer auf Array ?
 
Hast Du mal nachgeschaut, wie groß Boolean ist?

eric_draven 10. Okt 2011 13:26

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 ?

DeddyH 10. Okt 2011 13:29

AW: Pointer auf Array ?
 
So würde ich es zumindest machen.

eric_draven 10. Okt 2011 13:33

AW: Pointer auf Array ?
 
Danke ! :-)

DeddyH 10. Okt 2011 13:45

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;

eric_draven 10. Okt 2011 16:07

AW: Pointer auf Array ?
 
Nochmals Danke :-)
Hehe, hatte mir fast die gleiche Lösung überlegt:
Code:
 
  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;
Ich benutze noch Delphi 2005, bei XE(2) ist ein Zeichen eines Strings dann 2 Byte breit (Unicode), deshalb meinst Du AnsiString benutzen oder ?

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:

mkinzler 10. Okt 2011 16:09

AW: Pointer auf Array ?
 
Du kannst natürlich mehrere Booleans als Bitfelder speichern

eric_draven 10. Okt 2011 16:17

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.

mkinzler 10. Okt 2011 16:22

AW: Pointer auf Array ?
 
Eine Booleanvariable belegt ein Byte, da dies die kleinste (Speicher-)Einheit ist


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz