Record mit $00 befüllen.

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

Record mit $00 befüllen.

Beitrag von Mathias »

Gibt es unterdessen etwas eleganteres, um alles Elemente eines Recordes auf 0 zu setzen ?

Code: Alles auswählen

var
  r: TRect;
begin
  FillChar(r, SizeOf(r), $00); 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

paweld
Beiträge: 70
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Record mit $00 befüllen.

Beitrag von paweld »

Code: Alles auswählen

var
  r: TRect;
begin
  r := TRect.Empty;
Grüße / Pozdrawiam
paweld

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

Re: Record mit $00 befüllen.

Beitrag von Mathias »

Da habe ich anscheinend das blödeste Beispiel mit einem Typehelpern erwischt.

Ich meinte generell für alle Recorde.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Sieben
Beiträge: 281
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Record mit $00 befüllen.

Beitrag von Sieben »

Code: Alles auswählen

  MyRec := Default(TMyRec);

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

Re: Record mit $00 befüllen.

Beitrag von Mathias »

Danke, dies geht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Record mit $00 befüllen.

Beitrag von Mathias »

Sieben hat geschrieben: Sa 19. Okt 2024, 16:47

Code: Alles auswählen

  MyRec := Default(TMyRec);
Kann bei Default noch was anderes reinkommen, als TMyRec im obigen Beispiel ?
Wenn nein, was macht es dann für einen Sinn ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Sieben
Beiträge: 281
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Record mit $00 befüllen.

Beitrag von Sieben »

Guckst du hier.

Warf
Beiträge: 2079
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Record mit $00 befüllen.

Beitrag von Warf »

Default ist eine Intrinsic die einen "leeren" wert für einen Beliebigen typen zurück gibt. Der Grund warum es einen Parameter nimmt ist da es nicht nur zum Initialisieren genutzt werden kann, sondern auch in Ausdrücken:

Code: Alles auswählen

procedure Foo(ARec: TMyRec);
...

begin
  Foo(Default(TMyRec)); // wird mit Leerem MyRec aufgerufen
end.
Außerdem sollte dazu gesagt sein da Default ein Assignment macht (und zumindest auf trunk/main mittlerweile initialized data nutzt), ist es im gegensatz zu Fillchar sogar Kompatibel mit managed typen:

Code: Alles auswählen

type
  TMyRec = record
    S: String;
  end;
  
var
  r: TMyRec;
begin
  r.S:='Hello World';
  UniqueString(r.S);
  FillChar(r, SizeOf(r), #00); // Erzeugt memory leak
  //vs
  r:=Default(TMyRec); // Kein memory leak
end.

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

Re: Record mit $00 befüllen.

Beitrag von Mathias »

Jetzt wäre noch super wen sowas gehen würde.
Besonders wen es sich um einen komplexen Record handelt.

Code: Alles auswählen

procedure Test;
const
   foo: TfooRec=default(TfooRec);
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
six1
Beiträge: 831
Registriert: Do 1. Jul 2010, 19:01

Re: Record mit $00 befüllen.

Beitrag von six1 »

Mathias hat geschrieben: Sa 19. Okt 2024, 13:41 Gibt es unterdessen etwas eleganteres, um alles Elemente eines Recordes auf 0 zu setzen ?

Code: Alles auswählen

var
  r: TRect;
begin
  FillChar(r, SizeOf(r), $00); 
also für das Verständnis und die Lesbarkeit, meiner Meinung nach, nicht zu übertreffen!

alles andere ist dann wieder so C-artig +~#'!§$ :lol:
Gruß, Michael

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1535
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Record mit $00 befüllen.

Beitrag von fliegermichl »

Sehe ich auch so, verursacht aber einen Hint, daß der Bezeichner nicht initialisiert sein könnte.

Warf
Beiträge: 2079
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Record mit $00 befüllen.

Beitrag von Warf »

six1 hat geschrieben: Mo 9. Dez 2024, 12:55 also für das Verständnis und die Lesbarkeit, meiner Meinung nach, nicht zu übertreffen!
Ich mein es ist halt in vielen Fällen falsch, und da es ein statement ist und keine Expression nicht so vielseitig einsetzbar wie Default. Beispiel:

Code: Alles auswählen

generic function Foo<T>(AValue: T): T;
...
specialize Foo<TMyType>(default(TMyType));
Geht mit FillChar erstmal kategorisch nicht, weil man Fillchar nicht als expression übergeben kann, zum anderen wäre Fillchar an dieser stelle auch potentiell nicht Korrekt denn TMyType kann managed sein.
six1 hat geschrieben: Mo 9. Dez 2024, 12:55 alles andere ist dann wieder so C-artig +~#'!§$ :lol:
Fillchar ist eine eins zu eins Kopie der C funktion memset. Default als konstrukt gibt es in C nicht.
Wie kann etwas was es nicht in C gibt C-Artiger sein als etwas das aus C kopiert wurde?

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

Re: Record mit $00 befüllen.

Beitrag von Mathias »

six1 hat geschrieben: Mo 9. Dez 2024, 12:55
Mathias hat geschrieben: Sa 19. Okt 2024, 13:41 Gibt es unterdessen etwas eleganteres, um alles Elemente eines Recordes auf 0 zu setzen ?

Code: Alles auswählen

var
  r: TRect;
begin
  FillChar(r, SizeOf(r), $00); 
also für das Verständnis und die Lesbarkeit, meiner Meinung nach, nicht zu übertreffen!

alles andere ist dann wieder so C-artig +~#'!§$ :lol:
Ich muss leider sagen, es gibt viele Sachen, da hat C die Nase vorn.
Sowas geht zB. in C sehr elegant. Pascal erzeugt eine Syntax Fehler.

Code: Alles auswählen

// In einer Unit
type
  TRect = record
    x, y, w, h: integer;
  end;

const
  ZERO_RECT: TRect = (x: 0; y: 0; w: 0; h: 0);

// Im Hauptprogramm
  procedure foo;
  const
    r: TRect = ZERO_RECT;
  begin

  end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 2079
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Record mit $00 befüllen.

Beitrag von Warf »

Die (partielle) Struct Initialisierung seit C99 ist tatsächlich etwas was Pascal wirklich fehlt.

Bei der Deklaration den wert zu setzen

Code: Alles auswählen

myStruct s = {.x=42, .y=3.14};
Funktioniert so auch grundsätzlich in Pascal

Code: Alles auswählen

rec: TMyRec = (x:42,;y:3.14);
Aber was man bei C halt machen kann ist diese syntax auch im Funktionskörper benutzen:

Code: Alles auswählen

if (cond)
  s = {.x=42,.y=3.14};
else
  s = {.x=32,.y=2.71};
Und das geht in Pascal nicht so einfach.

Was ich schonmal überlegt habe zu bauen wäre default zu erweitern:

Code: Alles auswählen

rec := Default(TMyRec;X:42;Y:3.14);
Wobei dann der rest mit 0 aufgefüllt wird, so wie auch bei C

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

Re: Record mit $00 befüllen.

Beitrag von Mathias »

Code: Alles auswählen

s = {.x=42,.y=3.14};
geht die nicht sogar einfacher ?

Code: Alles auswählen

s = {42, 3.14};
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten