AGB  ·  Datenschutz  ·  Impressum  







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

Type eines Pointers ermitteln

Ein Thema von LeoDD · begonnen am 11. Jul 2007 · letzter Beitrag vom 11. Jul 2007
Antwort Antwort
LeoDD

Registriert seit: 30. Jul 2003
43 Beiträge
 
Delphi 2010 Professional
 
#1

Type eines Pointers ermitteln

  Alt 11. Jul 2007, 13:40
Grüß Gott

Ich erbitte Hilfe von euch zum Thema Pointer und dessen dahinterliegende Datenstruktur.

In einem Treeview verknüpfe ich über den Node.Data-Pointer Daten mit Knoten.

Die Daten selbst sind Records unterschiedlichen Typs.

Besteht für mich die Möglichkeit, durch den Zugriff auf den Pointer später noch herauszufinden, welcher Record-Typ hinter dem Pointer liegt? Wenn ja, wie?
Erst wenn man dreimal auf Holz klopfen will, stellt man fest, dass die Welt nur noch aus Plastik und Aluminium besteht.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Type eines Pointers ermitteln

  Alt 11. Jul 2007, 13:49
Record -> Nein
Klasse/Objektinstanz -> Ja (Mittels is-Operator/Classname).

Außer du hast eine "Basisstruktur" so das die ersten 4 Bytes einen Kenner mitliefern.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
LeoDD

Registriert seit: 30. Jul 2003
43 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Type eines Pointers ermitteln

  Alt 11. Jul 2007, 13:52
Hm, sehr schade. Dann muss ich die Sache noch mal umstricken und es wie hier aufbauen.

Dankeschön
Erst wenn man dreimal auf Holz klopfen will, stellt man fest, dass die Welt nur noch aus Plastik und Aluminium besteht.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: Type eines Pointers ermitteln

  Alt 11. Jul 2007, 13:53
Nein. Ein Pointer traegt keine Typinformation. Es ist einfach eine adresse. Ein Record traegt auch keine Typinformation. Es ist einfach ein Speicherbereich.
In der Source steht natuerlich der Typ. Der Compiler laesst bei der Kompilation aber alle Typinformation weg. Die wird ja nur gebraucht den richtigen Code zu generieren.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#5

Re: Type eines Pointers ermitteln

  Alt 11. Jul 2007, 14:25
Es gibt Möglichkeiten dafür, aber generell betrachtet ist ein Zeiger ein untypisierter Datentyp, er zteigt eben nur auf Irgendwas.

Eine Lösung wurde oben schon angesprochen. Du machst deine Records teilweise zueinander kompatibel. Zb. indem als allererstes Datenfeld zb. ein Zeiger "Type" einfügst, bei all deinen Records. Zb. so


Delphi-Quellcode:

type
  PBaseRecord = ^TBaseRecord;
  TBaseRecord = packed record
    Typ: PTypeInfo;
  end;

  TMyRecord1 = packed record
    Typ: PTypeInfo;
    
    Daten: ab hier;
  end;

  TMyRecord2 = packed record
    Typ: PTypeInfo;

    Daten ab hier;
  end;

procedure Test;
var
  Rec1, Rec2: PBaseRecord;
begin
  Rec1 := New(TMyRcord1);
  Rec1.Typ := TypeInfo(TMyRecord1);
  Rec1.Data := XYZ;

  Rec2 := New(TMyRecord2);
  Rec2.Typ := TypeInfo(TMyRecord2);

  if Rec1.Typ <> Rec2.Typ then
    ShowMessage('Records unterschieldich');
  if Rec1.Typ = TypeInfo(TMyRecord1) then
    ShowMessage(Record1 ist TMyRecord1');

ShowMessage(Rec1.Typ.Name);

end;
Eine andere Lösung ist es die Allozierung der Records für jeden Recordtypen in unterschiedliche Speicherbereich zu machen. Zb. so

Delphi-Quellcode:
var
  Rec1: array of TMyRecord1; // globaler Datenspeicher
  Rec2: array of TMyRecord2;

procedure Test;
var
  r1: Pointer;
begin
  SetLength(Rec1, Length(Rec1) +1);
  r1 := @Rec1[High(Rec1)];

  if PChar(r1) >= @rec1[0] and PChar(r1) <= @rec1[High(Rec1)]) then
    ShowMessage('Pointer r1 stammt aus array Rec1');
end;
Du kannst dann über die Addresse des Zeigers ermitteln von welchem Typ er ist.

ABER !

Was ist ein TObject im vergleich zu einem Record ? Ein TObject ist ein Record bei dem der Compiler uns sinnvolle Instrumente in die Hand gibt um typisiert und polymorph Daten zu verwalten. Polymorph ist das Stichwort, denn das ist es was du brauchst.

Ergo: die richtige Lösung ist es von deinen manuell allozierten Records wegzugehen und Klassen zu benutzen.

Gruß Hagen
  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 13:04 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