AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeiger auf eine Klasse

Ein Thema von Tenobaal · begonnen am 11. Aug 2013 · letzter Beitrag vom 12. Aug 2013
Antwort Antwort
Tenobaal

Registriert seit: 9. Mai 2013
21 Beiträge
 
Delphi XE5 Professional
 
#1

AW: Zeiger auf eine Klasse

  Alt 11. Aug 2013, 14:04
Danke für eure Hilfe.
Ich habe jetzt mehrere Varianten probiert und habe festgestellt, dass ich in obigen Beispiel nur einen Syntaxfehler hatte

@NamenLozer: Nach deiner Meinung sollte ich Variante 3 nehmen (siehe Code), oder? In Bezug auf die Performance ist diese Variante doch schlecht, weil das komplette Array nochmals kopiert werden muss.
Edit: Variante 1 und 2 hingegen verändern direkt den Inhalt von "PointsRotor" ohne zusätzlichen kopiervorgang.
Delphi-Quellcode:
//....

type TCoord_XY = record
  x,y:Double;
end;

type TPoints = Array of Array of TCoord_XY;
     PPoints = ^TPoints;
var
  Form1: TForm1;

//....

procedure TForm1.FormCreate(Sender: TObject);
var PointsRotor: TPoints;
    Ptr:PPoints;
    Ptr2:^TPoints;
    Ptr3:TPoints;
begin
SetLength(PointsRotor, 1,1); //Setze Größe des Arrays direkt
PointsRotor[0,0].x:=1; //Schreibe was in das Array...

//Variante 1
Ptr:=@PointsRotor;
SetLength(Ptr^, 2,1);

//Variante 2
Ptr2:=@PointsRotor;
SetLength(Ptr2^,3,1);

//Variante 3
Ptr3:=PointsRotor;
SetLength(Ptr3,4,1);
PointsRotor:=Copy(Ptr3,Low(Ptr3),High(Ptr3)+1);
end;

Geändert von Tenobaal (11. Aug 2013 um 14:10 Uhr)
  Mit Zitat antworten Zitat
Insider2004
(Gast)

n/a Beiträge
 
#2

AW: Zeiger auf eine Klasse

  Alt 11. Aug 2013, 14:20
Zur Info: Als Delphi von Anders aufgesetzt wurde, wählte er das "Zeigerlose Konzept". Deswegen brauchst Du auch keine Zeiger. Aber Du arbeitest ständig damit.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.869 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Zeiger auf eine Klasse

  Alt 11. Aug 2013, 15:13
Klassen sind Referenzen ( intern auch Zeiger) und Erleichtern den Umgang, da sie das Referenzieren/Dereferenzieren transparent durchführen ( geht z.T. auch bei Zeigertypen). Delphi ist aber trotzdem nicht zeigerlos, da das nur für Klassen gilt.
Markus Kinzler
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Zeiger auf eine Klasse

  Alt 11. Aug 2013, 16:11
Danke für eure Hilfe.
Ich habe jetzt mehrere Varianten probiert und habe festgestellt, dass ich in obigen Beispiel nur einen Syntaxfehler hatte

@NamenLozer: Nach deiner Meinung sollte ich Variante 3 nehmen (siehe Code), oder? In Bezug auf die Performance ist diese Variante doch schlecht, weil das komplette Array nochmals kopiert werden muss.
Edit: Variante 1 und 2 hingegen verändern direkt den Inhalt von "PointsRotor" ohne zusätzlichen kopiervorgang.
Du hast mich wohl missverstanden.

Delphi-Quellcode:
var
  A,B: array of integer;
begin
  SetLength(A, 3);
  A[0] := 1;
  A[1] := 2;
  A[2] := 3;

  writeln('A: ', A[0], ', ', A[1], ', ', A[2]);
  // => A: 1, 2, 3

  // REFERENZ
  B := A;

  writeln('B: ', B[0], ', ', B[1], ', ', B[2]);
  // => B: 1, 2, 3

  B[1] := 42;

  writeln('B: ', B[0], ', ', B[1], ', ', B[2]);
  // => B: 1, 42, 3

  writeln('A: ', A[0], ', ', A[1], ', ', A[2]);
  // => A: 1, 42, 3

  // KOPIE
  B := Copy(A, 0, length(B));

  B[0] := 2;
  B[1] := 5;
  B[2] := 7;

  writeln('B: ', B[0], ', ', B[1], ', ', B[2]);
  // => B: 2, 5, 7

  writeln('A: ', A[0], ', ', A[1], ', ', A[2]);
  // => A: 1, 42, 3
end.
Ist das Prinzip jetzt klar?

Geändert von Namenloser (11. Aug 2013 um 16:21 Uhr) Grund: typo
  Mit Zitat antworten Zitat
Tenobaal

Registriert seit: 9. Mai 2013
21 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Zeiger auf eine Klasse

  Alt 12. Aug 2013, 00:21
Okay, ich hab verstanden was du meinst. Es gab aber eine Besonderheit bei mir:
Der SetLength(...) Befehlt sorgt scheinbar dafür, dass neuer Speicher reserviert wird. Deshalb gabs bei mir arge Probleme.
Dazu folgendes Beispiel:

Delphi-Quellcode:
type TCoord_XY = record
  x,y:Double;
end;

type TPoints = Array of Array of TCoord_XY;
     PPoints = ^TPoints;

//...

procedure TForm1.FormCreate(Sender: TObject);
var PointsRotor: TPoints;
    Ptr3:TPoints;
begin
SetLength(PointsRotor, 1,1); //Setze Größe des Arrays direkt
PointsRotor[0,0].x:=1; //Schreibe was in das Array...

//...

//Variante 3
Ptr3:=PointsRotor;
SetLength(Ptr3,4,1);// Ptr3 bekommt neuen Speicher zugewiesen?!?
Ptr3[0,0].x:=2; //keine Auswirkung auf PointsRotor... PointsRotor[0,0] ist immernoch 1


//Variante 4
SetLength(Ptr3,4,1);
Ptr3:=PointsRotor;
Ptr3[0,0].x:=3; //Pointsrotor wird verändert
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Zeiger auf eine Klasse

  Alt 12. Aug 2013, 00:45
Wieso verwendest du keine Klassen im Sinne der objekt-orientierten Programmierung?
In deinem Beitrag #1 redest du von Motoren und dessen Geometrie.
Warum gibt es dann keine Klasse TMotor oder T3DShape?

Diese Art zu denken man bräuchte einen Zeiger auf ein Array auf ein Array mit Records von x,y-Koordinaten nennt man primitive Obsession.
Code und Datenstruktur sind nicht miteinander verbunden sondern getrennt.
Das führt zu einer Vielzahl von Fehlern, da die Datenstrukturen ungeschützt sind.
In der OOP werden Daten und Code in Klassen verheiratet ("Kapselung") wobei der Code den Zugriff aus die Daten regelt.

Hier mal etwas Lesestoff zu OOP:
http://openbook.galileocomputing.de/oop/
fork me on Github
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

AW: Zeiger auf eine Klasse

  Alt 12. Aug 2013, 09:22
Und als Ergänzung: Deutsche PDF-Dateien, die sich (vorwiegend) ausgiebig mit OOP (vorwiegend) in Delphi befassen.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zeiger auf eine Klasse

  Alt 12. Aug 2013, 11:15
Ein kleines Beispiel mit Objekten:
Delphi-Quellcode:
type
  TCoord_XY = record //Speichert eine X-Y-Koordinate
    x,y: Double;
  end;

  TPoints = class(TObject)
  private
    FItems: array of array of TCoord_XY;
    function GetItems(x, y: Integer): TCoord_XY;
    procedure SetItems(x, y: Integer; AValue: TCoord_XY);
    function GetSizeX: Integer;
    function GetSizeY: Integer;
  public
    procedure Assign(AValue: TPoints);
    procedure SetSize(x, y: Integer);
    property Items[x, y: Integer]: TCoord_XY read GetItems write SetItems; default;
    property SizeX: Integer read GetSizeX;
    property SizeY: Integer read GetSizeY;
  end;

  TRotor = class(TObject)
  private
    FPoints: TPoints;
  public
    property Points: TPoints read FPoints write FPoints;
  end;

function Coord_XY(x, y: Double): TCoord_XY;

implementation

function Coord_XY(x, y: Double): TCoord_XY;
begin
  Result.x := x;
  Result.y := y;
end;

procedure TPoints.Assign(AValue: TPoints);
begin
  FItems := Copy(AValue.FItems);
end;

function TPoints.GetItems(x, y: Integer): TCoord_XY;
begin
  Result := FItems[x, y];
end;

procedure TPoints.SetItems(x, y: Integer; AValue: TCoord_XY);
begin
  FItems[x, y] := AValue;
end;

function TPoints.GetSizeX: Integer;
begin
  Result := Length(FItems);
end;

function TPoints.GetSizeY: Integer;
begin
  if Length(FItems) > 0 then
    Result := Length(FItems[0])
  else
    Result := 0;
end;

procedure TPoints.SetSize(x, y: Integer);
begin
  SetLength(FItems, x, y);
end;


procedure Test;
var
  Points1, Points2: TPoints;
  Rotor1, Rotor2, Rotor3: TRotor;
begin
  Points1 := nil;
  Points2 := nil;
  Rotor1 := nil;
  Rotor2 := nil;
  Rotor3 := nil;
  try
    {erstes Punkte-Objekt erzeugen}
    Points1 := TPoints.Create;
    Points1.SetSize(1, 1);
    Points1[0, 0] := Coord_XY(1, 0);

    {Rotor mit erstem Punkte-Objekt erzeugen}
    Rotor1 := TRotor.Create;
    Rotor1.Points := Points1;

    {Rotor mit erstem Punkte-Objekt erzeugen}
    Rotor2 := TRotor.Create;
    Rotor2.Points := Points1;

    {zweites Punkte-Objekt erzeugen}
    Points2 := TPoints.Create;
    {bekommt eine Kopie der Punkte des ersten Objekts}
    Points2.Assign(Points1);
    {die Kopie wird verändert}
    Points2.SetSize(3, 1);
    Points2[2, 0] := Coord_XY(3, 0);

    {Rotor mit zweitem Punkte-Objekt erzeugen}
    Rotor3 := TRotor.Create;
    Rotor3.Points := Points2;

    {Points1 und damit Rotor1.Points und Rotor2.Points verändern,
     aber nicht Points2 und Rotor3.Points}

    Points1.SetSize(2, 1);
    Points1[1, 0] := Coord_XY(2, 0);

  finally
    Rotor1.Free;
    Rotor2.Free;
    Rotor3.Free;
    Points1.Free;
    Points2.Free;
  end;
end;
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Zeiger auf eine Klasse

  Alt 12. Aug 2013, 00:52

Delphi-Quellcode:
type TCoord_XY = record
  x,y:Double;
end;

type TPoints = Array of Array of TCoord_XY;
     PPoints = ^TPoints;

procedure TForm1.FormCreate(Sender: TObject);
var PointsRotor: TPoints;
    Ptr3:TPoints;
begin
SetLength(PointsRotor, 1,1); //Setze Größe des Arrays direkt
PointsRotor[0,0].x:=1; //Schreibe was in das Array...

//Variante 3
Ptr3:=PointsRotor;
SetLength(Ptr3,4,1);// Ptr3 bekommt neuen Speicher zugewiesen?!?
Ptr3[0,0].x:=2; //keine Auswirkung auf PointsRotor... PointsRotor[0,0] ist immernoch 1


//Variante 4
SetLength(Ptr3,4,1);
Ptr3:=PointsRotor;
Ptr3[0,0].x:=3; //Pointsrotor wird verändert
end;

end.
Der Unterschied kommt deshalb zustande, weil Delphi bei jedem Aufruf von SetLength das Array kopiert.
  Mit Zitat antworten Zitat
Antwort Antwort


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