const record von const record

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

const record von const record

Beitrag von Mathias »

Ist es irgendwie möglich, das ich bei der 2. Konstante den Wert v an vec zuweisen kann ?

Code: Alles auswählen

type
  TVec = record
    x, y: single;
  end;

  TVecs = record
    r0: single;
    vec: TVec;
    r1: single;
  end;

const
  v: TVec = (x: 1; y: 2);
  v2: TVecs = (r0: 1; vec: v; r1: 2); // bei v motzt er

Code: Alles auswählen

project1.lpr(16,28) Error: Syntax error, "(" expected but "identifier V" found
Sowas geht wie erwartet.

Code: Alles auswählen

  v1: TVecs = (r0: 1; vec: (x: 3; y: 4); r1: 2); // bei v motzt er
Dieser Code habe ich stark vereinfacht. Beim endgültigen Programm ist v1 eine Array, bei dem mehrmals das gleiche vec vorkommt.
Oder bleibt mit da wohl oder üblich nichts anderes übrig, als die Daten in einer procedure manuell zu zuweisen ?


In C geht dies so einfach:

Code: Alles auswählen

constexpr Material      ivory = {1.0, {0.9,  0.5, 0.1, 0.0}, {0.4, 0.4, 0.3},   50.};
constexpr Material     mirror = {1.0, {0.0, 16.0, 0.8, 0.0}, {1.0, 1.0, 1.0}, 1425.};

constexpr Sphere spheres[] = {
    {{-3,    0,   -16}, 2,      ivory},
    .....
    {{ 7,    5,   -18}, 4,     mirror}
};
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: const record von const record

Beitrag von PascalDragon »

Mathias hat geschrieben:
So 3. Sep 2023, 16:01
Ist es irgendwie möglich, das ich bei der 2. Konstante den Wert v an vec zuweisen kann ?
Nein, da nur untypisierte Konstanten wahre Konstanten sind und du brauchst wahre Konstanten, um sie auf der rechten Seite von Konstanten oder als Teil eines Initializers zu verwenden. Typisierte Konstanten widerum sind letztlich einfach nur Variablen, bei denen der Compiler sichergeht, dass du nicht schreiben kannst (was aber nicht heißt, dass du es nicht über Pointerzugriffe erreichen kannst) und je nach Plattform die Daten in einer Read Only Sektion der Binary ablegt, statt in einer Read Write Sektion.
Und von Records können keine untypisierten Konstanten erzeugt werden. Dazu werden Erweiterungen aus Extended Pascal benötigt, die zwar prinizpiell geplant, aber nicht konkret in nächster Zukunft auf der Liste sind.
FPC Compiler Entwickler

Mathias
Beiträge: 6210
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: const record von const record

Beitrag von Mathias »

(was aber nicht heißt, dass du es nicht über Pointerzugriffe erreichen kannst)
Ich habe es jetzt mal mit Pointer probiert, scheint zu klappen.
Danke für den Tip.

Code: Alles auswählen

type
  PVec = ^TVec;
  TVec = record
    x, y: single;
  end;

  TVecs = record
    r0: single;
    vec: PVec;
    r1: single;
  end;

const
  v: TVec = (x: 1; y: 2);
  v2: TVecs = (r0: 1; vec: @v; r1: 2); // geht
Was ich mir da noch vorstellen kann, v ist da nur einmal im Speicher, bei der C-Variante, wird es wohl mehrmals sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: const record von const record

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mo 4. Sep 2023, 16:14
(was aber nicht heißt, dass du es nicht über Pointerzugriffe erreichen kannst)
Ich habe es jetzt mal mit Pointer probiert, scheint zu klappen.
Danke für den Tip.
Das war zwar nicht, worauf ich anspielte, aber wenn du für dich dadurch eine Lösung gefunden hast... 😅
FPC Compiler Entwickler

Antworten