AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Pointer auf Array ?

Ein Thema von eric_draven · begonnen am 10. Okt 2011 · letzter Beitrag vom 10. Okt 2011
Antwort Antwort
eric_draven

Registriert seit: 26. Jul 2007
15 Beiträge
 
#1

Pointer auf Array ?

  Alt 10. Okt 2011, 14:14
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;

Geändert von eric_draven (10. Okt 2011 um 14:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.459 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Pointer auf Array ?

  Alt 10. Okt 2011, 14:20
Hast Du mal nachgeschaut, wie groß Boolean ist?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
eric_draven

Registriert seit: 26. Jul 2007
15 Beiträge
 
#3

AW: Pointer auf Array ?

  Alt 10. Okt 2011, 14:26
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.459 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Pointer auf Array ?

  Alt 10. Okt 2011, 14:29
So würde ich es zumindest machen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
eric_draven

Registriert seit: 26. Jul 2007
15 Beiträge
 
#5

AW: Pointer auf Array ?

  Alt 10. Okt 2011, 14:33
Danke !
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.459 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Pointer auf Array ?

  Alt 10. Okt 2011, 14:45
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
eric_draven

Registriert seit: 26. Jul 2007
15 Beiträge
 
#7

AW: Pointer auf Array ?

  Alt 10. Okt 2011, 17:07
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.830 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Pointer auf Array ?

  Alt 10. Okt 2011, 17:09
Du kannst natürlich mehrere Booleans als Bitfelder speichern
Markus Kinzler
  Mit Zitat antworten Zitat
eric_draven

Registriert seit: 26. Jul 2007
15 Beiträge
 
#9

AW: Pointer auf Array ?

  Alt 10. Okt 2011, 17:17
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.830 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Pointer auf Array ?

  Alt 10. Okt 2011, 17:22
Eine Booleanvariable belegt ein Byte, da dies die kleinste (Speicher-)Einheit ist
Markus Kinzler
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf