AGB  ·  Datenschutz  ·  Impressum  







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

Record erweitern

Ein Thema von Bomberbb · begonnen am 14. Jan 2009 · letzter Beitrag vom 15. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#1

Record erweitern

  Alt 14. Jan 2009, 14:41
Hallo,

mal ne Frage: Kann ich in einem Rekord mit 2 Variablen auf die gleiche Speicherstelle verweisen?

Gruß

BBB
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Record erweitern

  Alt 14. Jan 2009, 14:43
Mit varianten Records (Hilfe sagt dazu mehr) geht das:
Delphi-Quellcode:
... = record
  ...
  case Integer of
    1: (felder1);
    2: (felder2);
  end;
felder1 und felder2 haben nun den gleichen Startpunkt im Speicher.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.154 Beiträge
 
Delphi 12 Athens
 
#3

Re: Record erweitern

  Alt 14. Jan 2009, 14:53
mal ein praktisches Beispiel:
Delphi-Quellcode:
type
  LongRec = packed record
    case Integer of
      0: (Lo, Hi: Word);
      1: (Words: array [0..1] of Word);
      2: (Bytes: array [0..3] of Byte);
  end;
Weiteres siehe Delphihilfe
Abschnitt: Delphi-Referenz durchsuchenVariante Teile in Record-Typen (auch zu finden über Abschnitte Record-Typen oder Record-Konstanten)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#4

Re: Record erweitern

  Alt 14. Jan 2009, 15:31
Ich will ein vorhandenes Record
Delphi-Quellcode:
rec=record
  p1:tpoint;
  p2:tpoint;
  p3:tpoint;
  p4:tpoint;
end;
so erweitern:
Delphi-Quellcode:
rec=record
  p1:tpoint;
  p2:tpoint;
  p3:tpoint;
  p4:tpoint;
  p:Array[1..4]of tpoint;
end;
ggf. auch mit pointern. So dass ich mit rec.p1 und rec.p[1] auf den gleichen Wert zugreife.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.154 Beiträge
 
Delphi 12 Athens
 
#5

Re: Record erweitern

  Alt 14. Jan 2009, 15:37
wie zu sehn ... ist es doch recht einfach
Delphi-Quellcode:
type
  Rec = record
    case Integer of
      0: (p1: TPoint;
          p2: TPoint;
          p3: TPoint;
          p4: TPoint);
      1: (p: Array[1..4] of TPoint);
  end;
oder
Delphi-Quellcode:
type
  Rec = record
    case Integer of
      0: (p1, p2, p3, p4: TPoint);
      1: (p: Array[1..4] of TPoint);
  end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#6

Re: Record erweitern

  Alt 14. Jan 2009, 15:55
gut funktionieren tut es, aber verstanden hab ich's trotz Durchlesen der Hilfe noch nicht.

Was sagt mir
  case integer of ?

Sollte der Selektor einer CaseAnweisung nicht eine Variable sein???

In der Hilfe steht:
Zitat:
Der variante Teil eines Records enthält mehrere Varianten, die sich denselben Speicherplatz teilen.
Kann ich davon ausgehen das bei folgender Definition:
Delphi-Quellcode:
type
  Rec = record
    case Integer of
      0: (p1, p2, p3, p4: TPoint);
      1: (p: Array[1..4] of TPoint);
  end;
immer gilt p1=p[1], p2=p[2]...?
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#7

Re: Record erweitern

  Alt 14. Jan 2009, 16:01
Wenn du noch ein packed rein setzt sollte das sicher so sein, ohne bin ich nicht sicher, ob dir das Alignment nicht reinpfuscht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.154 Beiträge
 
Delphi 12 Athens
 
#8

Re: Record erweitern

  Alt 14. Jan 2009, 16:03
Jupp, davon kanns du ausgehen (nja, zumindestens die Feldausrichtung im Record dieses hergibt)
drum verwende ich oftmals ganz gern packed Records und Arrays

Delphi-Quellcode:
Rec = record
  case x: Integer of
    0: (p1, p2, p3, p4: TPoint);
    1: (p: Array[1..4] of TPoint);
end;
ohne Feldnahmen im CASE wird der dort angegebene Type zur Unterteilng er einzelnen überlagerten Teile verwendet

Delphi-Quellcode:
Rec = record
  case Boolean of
    false: (p1, p2, p3, p4: TPoint);
    true: (p: Array[1..4] of TPoint);
end;

// oder

MySet = (msPoints, msPointArray);
Rec = record
  case Boolean of
    msPoints: (p1, p2, p3, p4: TPoint);
    msPointArray: (p: Array[1..4] of TPoint);
end;

bezüglich der "Variable"
Delphi-Quellcode:
Rec = record
  case x: Integer of
    0: (p1, p2, p3, p4: TPoint);
    1: (p: Array[1..4] of TPoint);
end;

// entspricht

Rec = record
  x: Integer;
  case Integer of
    0: (p1, p2, p3, p4: TPoint);
    1: (p: Array[1..4] of TPoint);
end;
// bzw.
Rec = record
  x: Integer;
  p1, p2, p3, p4: TPoint;
end;
in diesem Fall könnte man X z.B. dazu verwenden welche Defiinition verwendet wird.
vorallem nützlich, wenn man da unterschiedliche ypen einbaut
Delphi-Quellcode:
Rec = record
  case verwendet: Integer of
    0: (s: string);
    1: (i: integer);
    2: (b: byte);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#9

Re: Record erweitern

  Alt 14. Jan 2009, 16:11
Also. ich werde das nur für gleiche Typen nutzen. Ich will einfach ein vorhandenes Record so erweitern, dass ich über ein Array auf die Punkte zugreifen kann, was das arbeiten damit einfacher macht. Leider ist das Record 20 Jahre alt und eine generelle Umstellung wäre fatal.

Besten Dank! und schönen Feierabend!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.154 Beiträge
 
Delphi 12 Athens
 
#10

Re: Record erweitern

  Alt 14. Jan 2009, 16:20
seit 'ner Weile (ich glaub Delphi 2006) geht auch Folgendes:
Delphi-Quellcode:
TRec = record
  p1, p2, p3, p4: TPoint;
private
  function ReadP(index: integer): TPoint;
  procedure WriteP(index: integer; p: TPoint);
public
  property p[index: integer]: TPoint read ReadP write WriteP;
  procedure ReadP3: TPoint;
end;

function TRec.ReadP(index: integer): TPoint;
begin
  case index of
    1: result := p1;
    2: result := p2;
    3: result := p3;
    4: result := p4;
  end;
end;

procedure TRec.WriteP(index: integer; p: TPoint);
begin
  case index of
    1: p1 := p;
    2: p2 := p;
    3: p3 := p;
    4: p4 := p;
  end;
end;

procedure TRec.ReadP3: TPoint;
begin
  result := p3;
end;
also fast so wie man es auch von den Klassen her kennt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:30 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