AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Pointer auf Array

Ein Thema von Nic2012 · begonnen am 9. Mai 2012 · letzter Beitrag vom 9. Mai 2012
Antwort Antwort
Nic2012

Registriert seit: 2. Mai 2012
62 Beiträge
 
#1

Pointer auf Array

  Alt 9. Mai 2012, 10:13
Möchte in einer TQueue (D7) items vom typ [array of bytes] verwalten, einfügen über
Code:
queue.push(item@)
und auslesen über
Code:
item := queue.Pop^
, was zu einer Fehlermeldung führt: "Inkompatible Typen: 'Array' und 'procedure, untyped pointer or untyped parameter'"

ich stehe etwas auf dem Schlauch, wie muss ich hier typisieren bzw. casten ?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Pointer auf Array

  Alt 9. Mai 2012, 10:35
Was führt den zu der Fehlermeldung?
Die erste oder die zweite Zeile?
Übrigens würde ich an Deiner Stelle abstand von "Item" nehmen, das könnte u.U. Irritationen und Mißverständnisse hervorrufen.

und wenn Du einen Pointer brauchst dann solltest Du das so
MyPointer:=@MyData; machen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Pointer auf Array

  Alt 9. Mai 2012, 10:45
Ungetestet (hab hier kein Delphi 7):
Delphi-Quellcode:
type
  TMyData = Datentyp;

...

var Data: TMyData;

queue.push(@Data);

Data := TMyData(queue.pop)^;
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
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Pointer auf Array

  Alt 9. Mai 2012, 10:57
Ungetestet (hab hier kein Delphi 7):
Delphi-Quellcode:
type
  TMyData = Datentyp;

...

var Data: TMyData;

queue.push(@Data);

Data := TMyData(queue.pop)^;
Leider so nicht ganz richtig.
Muss richtig heißen:
Code:
Data := TMyData(queue.pop^);
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Pointer auf Array

  Alt 9. Mai 2012, 10:59
Du hast natürlich recht, ich hatte erst noch einen PMyData-Typen deklariert und verwendet, den aber wieder rausgeworfen, ohne das ^ zu verschieben
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
Nic2012

Registriert seit: 2. Mai 2012
62 Beiträge
 
#6

AW: Pointer auf Array

  Alt 9. Mai 2012, 11:44
Alles klar, danke.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.395 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Pointer auf Array

  Alt 9. Mai 2012, 13:16
Variablen vom Typ eines dynamischen Arrays sind bereits Pointer.

Zwei wichtige Sachen müssen beachtet werden:
- Jedes dynamische Array hat einen Referenzzähler, fällt dieser auf 0 werden die Daten des Arrays freigegeben.
- Der Inhalt des Arrays kann nachräglich verändert werden. Weisen mehrere Pointer oder Variablen auf das selbe Array, verändern sich die Daten für alle.
Delphi-Quellcode:
uses
  Types, Contnrs;

procedure PushByteDynArray(AQueue: TQueue; const AValue: TByteDynArray);
procedure PopByteDynArray(AQueue: TQueue; var AValue: TByteDynArray);

implementation

procedure PushByteDynArray(AQueue: TQueue; const AValue: TByteDynArray);
var
  p: Pointer;
begin
  {wichtig, Delphi versucht bei der Zuweisung eines anderen dyn. Arrays
   den Referenzzähler des bisher zugewiesenen dyn. Arrays zu verringern}

  p := nil;

  {eindeutige Kopie erzeugen und Referenzzähler auf 1 setzen}
  TByteDynArray(p) := Copy(AValue);

  AQueue.Push(p);
end;

procedure PopByteDynArray(AQueue: TQueue; var AValue: TByteDynArray);
begin
  {für den bisherigen Inhalt Referenzzähler -1 , eventuell freigeben}
  AValue := nil;
  {der Cast verhindert die Referenzzählung}
  Pointer(AValue) := AQueue.Pop;
end;
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.676 Beiträge
 
Delphi 2007 Enterprise
 
#8

AW: Pointer auf Array

  Alt 9. Mai 2012, 14:06
Alternativ ließe sich auch noch eine Klasse um den Arraytypen bauen, die dann dafür sorgt, dass der RefCounter nicht versickert.
Delphi-Quellcode:
type
  TByteArray = array of Byte;
  TMyArrayContainer = class
  private
    FData: TByteArray;
    function GetValue(index: Integer): Byte;
    procedure SetValue(index: Integer; Value: Byte);
    function GetLength: Integer
    procedure SetLength(Value: Integer);
  public
    property Data: TByteArray read FData write FData;
    property Value[index: Integer]: Byte read GetValue write SetValue; default;
    property Length: Integer read GetLength write SetLength;
  end;

function TMyArrayContainer.GetValue(index: Integer): Byte;
begin
  if (index<Low(FData)) or (index>High(FData)) then
    raise EIndexOutOfBoundsException.Create
  else
    result := FData[index];
end;

procedure TMyArrayContainer.SetValue(index: Integer; Value: Byte);
begin
  if (index<Low(FData)) or (index>High(FData)) then
    raise EIndexOutOfBoundsException.Create
  else
    FData[index] := Value;
end;

procedure TMyArrayContainer.SetLength(Value: Integer);
begin
  SetLength(FData, Value);
end;

function TMyArrayContainer.GetLength: Integer;
begin
  result := Length(FData);
end;
Das noch mit Generics gibt einen ziemlich netten OOP-mäßigen Wrapper, der auch insgesamt das Handling etwas aufhübscht wie ich finde.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  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 09:24 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