Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Inkompatible Typen: 'TTest' und 'PTest' (https://www.delphipraxis.net/190500-inkompatible-typen-ttest-und-ptest.html)

Bjoerk 10. Okt 2016 12:16

Inkompatible Typen: 'TTest' und 'PTest'
 
Versteh ich nicht. Kann mich bitte jemand aufklären? // ***
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Classes, SysUtils;

type
  PTest = ^TTest;
  TTest = record
    X, Y, Z: double;
  end;

  PTestArray = ^TTestArray;
  TTestArray = array[1..MaxInt div SizeOf(TTest)] of TTest;

  TTestList = class
  private
    FCount: integer;
    FItems: PTestArray;
    function Get(Index: Integer): TTest;
    procedure Put(Index: integer; const Value: TTest);
    procedure SetCount(const Value: integer);
  public
    property Count: Integer read FCount write SetCount;
    property Items[Index: Integer]: TTest read Get write Put;
  end;

implementation

{ TTestList }

function TTestList.Get(Index: Integer): TTest;
begin
  Result := FItems^[Index];
end;

procedure TTestList.Put(Index: integer; const Value: TTest);
var
  P: PTest;
begin
  New(P);
  P^.X := Value.X;
  P^.Y := Value.Y;
  FItems[Index] := P; // *** [DCC Fehler] Unit2.pas(45): E2010 Inkompatible Typen: 'TTest' und 'PTest'
end;

procedure TTestList.SetCount(const Value: integer);
begin

end;

end.

Uwe Raabe 10. Okt 2016 12:19

AW: Inkompatible Typen: 'TTest' und 'PTest'
 
Ist doch ganz logisch:

Delphi-Quellcode:
TTestArray = array[..] of TTest;

var
  P: PTest;

  FItems[Index] := P; // *** [DCC Fehler] Unit2.pas(45): E2010 Inkompatible Typen: 'TTest' und 'PTest'

  FItems[Index] := P^; // sollte dann gehen.
Ist aber vielleicht nicht das, was du vorhast.

hoika 10. Okt 2016 12:22

AW: Inkompatible Typen: 'TTest' und 'PTest'
 
Hallo,

TTestArray = array[1..MaxInt div SizeOf(TTest)] of TTest;

dein Array ist vom Typ TTest, du willst mit P aber P ein PTest zuweisen.
Nimm mal P^ .

himitsu 10. Okt 2016 12:30

AW: Inkompatible Typen: 'TTest' und 'PTest'
 
Zitat:

Delphi-Quellcode:
FItems[Index] := P^; // sollte dann gehen.

"Geht", aber dann wird nur eine Kopie des Records in der Liste gespeichert und es entsteht ein cooles Speicherleck, da niemand den Pointer (P von New) wieder freigibt.

Uwe Raabe 10. Okt 2016 12:35

AW: Inkompatible Typen: 'TTest' und 'PTest'
 
Zitat:

Zitat von himitsu (Beitrag 1350356)
Zitat:

Delphi-Quellcode:
FItems[Index] := P^; // sollte dann gehen.

"Geht", aber dann wird nur eine Kopie des Records in der Liste gespeichert und es entsteht ein cooles Speicherleck, da niemand den Pointer (P von New) wieder freigibt.

Das wäre dann aber ein anderes Topic 8-)

Eventuell ist aber auch
Delphi-Quellcode:
TTestArray = array[..] of PTest;
gemeint. Dann müsste aber noch jemand die dortigen Pointer wieder freigeben.

Leute, kauft euch ein aktuelles Delphi (gibts sogar gerade geschenkt) und schreibt
Delphi-Quellcode:
TTestList = class(TList<TTest>);
und gut ist's.

Bjoerk 10. Okt 2016 13:01

AW: Inkompatible Typen: 'TTest' und 'PTest'
 
Die Starter hat glaub' ich keine Generics?

Fritzew 10. Okt 2016 13:18

AW: Inkompatible Typen: 'TTest' und 'PTest'
 
Zitat:

Zitat von Bjoerk (Beitrag 1350360)
Die Starter hat glaub' ich keine Generics?

Wie kommst Du den da drauf?
Das würde ja überhaupt keinen Sinn machen.

himitsu 10. Okt 2016 13:21

AW: Inkompatible Typen: 'TTest' und 'PTest'
 
Compiler-Features sind immer Alle drin.
Komponenten der IDE oder für's Programm fehlen dagegen, bei bestimmten Editionen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 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