Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Const record (https://www.delphipraxis.net/152845-const-record.html)

hansmaad 9. Jul 2010 09:35

Delphi-Version: 2010

Const record
 
Hallo Zusammen...
Ich möchte ein const record deklarieren, das selber ein record Feld besitzt:

Delphi-Quellcode:
type
    A = record
        x : Integer;
        y : Integer;
    end;

    B = record
        xy : A;
        z : Integer;
    end;
const
    AA : A = (x : 0; y : 0);
    BB : B = (xy : AA; z : 0); // <--
Code:
 E2029 '(' erwartet, aber Bezeichner 'AA' gefunden
Geht das nicht?

Danke&Grüße
hansmaad

mkinzler 9. Jul 2010 09:38

AW: Const record
 
Versuch mal
Delphi-Quellcode:
BB : B = (xy : (AA); z : 0);

hansmaad 9. Jul 2010 09:43

AW: Const record
 
Das hatte ich auch schon ausprobiert.
Delphi-Quellcode:
BB : B = (xy : (AA); z : 0);
Code:
E2003 Undeklarierter Bezeichner: 'AA'
Edit:

Das geht: (ich mein zwar auch das schon ausprobiert zu haben, aber nu gehts;-))
Delphi-Quellcode:
BB : B = (xy : (x : 0; y : 0); z : 0);

Mich würde trotzdem noch interessieren, ob es auch eine Lösung gibt, die AA verwendet.

himitsu 9. Jul 2010 09:45

AW: Const record
 
Typisierte Konstanten sind ja keine echten Konstanten
(es sind nur schreibgeschützte Variablen)

Also könnte es sein, daß die strenge Typenprüfung AA also nicht richtig als Konstante an dieser Stelle anerkennt.

Delphi-Quellcode:
BB : B = (xy : (x : 0; y : 0); z : 0);
.

Delphi-Quellcode:
BB : B = (xy : (x : AA.x; y : AA.y); z : 0);

gammatester 9. Jul 2010 09:47

AW: Const record
 
Es dürfen nur konstante Ausdrücke verwendet werden. "Typed const" sind nicht konstant. Man kann keinen konstanten Record definieren.

himitsu 9. Jul 2010 09:54

AW: Const record
 
"echte" Konstante:
Delphi-Quellcode:
const NAME = WERT;
.

typisierte Konstante:
Delphi-Quellcode:
const NAME: TYP = WERT;
.

(falls jemand den Unterschied nicht gleich erkennt)

mleyen 9. Jul 2010 10:03

AW: Const record
 
Folgendes würde funktionieren:
Delphi-Quellcode:
type
  PA = ^A;
  A = record
    x: Integer;
    y: Integer;
  end;

  B = record
    xy: PA;
    z: Integer;
  end;
 
const
  AA: A = (x: 10; y : 0);
  BB: B = (xy: @AA; z : 0);

hansmaad 9. Jul 2010 10:15

AW: Const record
 
Danke euch allen, gute Infos:thumb:

Aber was genau heißt denn "typisierte Konstanten sind nicht konstant"?

Delphi-Quellcode:
AA.x := 1;
führt zu der von mir erwarteten Fehlermeldung ".. kann nichts zugewiesen werden".
AA ist eine typisierte Konstante und für mich ziemlich konstant. Falsch?

mirage228 9. Jul 2010 10:17

AW: Const record
 
Über den Compiler-Schalter
Delphi-Quellcode:
{$J+}
solltest Du solche Konstanten dennoch beschreiben können ;)

hansmaad 9. Jul 2010 10:40

AW: Const record
 
Zitat:

Zitat von mirage228 (Beitrag 1034457)
Über den Compiler-Schalter
Delphi-Quellcode:
{$J+}
solltest Du solche Konstanten dennoch beschreiben können ;)

Aha...ok... naja ich will das ja gar nicht:wink:

Und gleich noch eine Frage zu const.
Delphi-Quellcode:
procedure Foo;
const
  AA : A = (x : 0; y : 0);
begin
 //...
end;
Wann wird AA initialisiert? First call, bei jedem Call, bei Programmstart...?

mleyen 9. Jul 2010 10:46

AW: Const record
 
AA wird nicht initialisiert. Es steht in der Echse einfach von Beginn an.

himitsu 9. Jul 2010 10:53

AW: Const record
 
Zitat:

Zitat von hansmaad (Beitrag 1034456)
Aber was genau heißt denn "typisierte Konstanten sind nicht konstant"?

Zitat:

Zitat von himitsu (Beitrag 1034439)
Typisierte Konstanten sind ja keine echten Konstanten
(es sind nur schreibgeschützte Variablen)

Wie gesagt, es sind intern, von der Typen/-Speicherverwaltung Variablen, welche aber vom Compiler mit einem Schreibschutzt versehen sind. Der Kompiler läßt also keine schreibenden Zugriffe zu und stoppt dort mit dem Kompilieren.

Es ist praktisch das selbe wie ein globales
Delphi-Quellcode:
var XXX: Interger = 132;
, nur eben mit Schreibschutztprüfung.

(es sei denn man schaltet die Prüfung ab)
Zitat:

Zitat von mirage228 (Beitrag 1034457)
Über den Compiler-Schalter
Delphi-Quellcode:
{$J+}
solltest Du solche Konstanten dennoch beschreiben können ;)

Selbst wenn man sowas nicht will, bleibt es dennoch bei der Speicherverwaltung ... aber dieses ist auch der Grund, warum man diesen Schreibschutzt überhaupt abschalten kann.

hansmaad 9. Jul 2010 10:55

AW: Const record
 
Zitat:

Zitat von mleyen (Beitrag 1034470)
AA wird nicht initialisiert. Es steht in der Echse einfach von Beginn an.

Also "bei Programmstart".
Ok, genug geconst:)
Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:16 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-2025 by Thomas Breitkreuz