Wieso kommt dieser Compilerhinweis?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1833
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Wieso kommt dieser Compilerhinweis?

Beitrag von fliegermichl »

Code: Alles auswählen

program Project1;
type
  TPoint = record
    x, y : integer;
  end;

var Points : array of TPoint;

begin
  SetLength(Points, 3);
  Points[0].x := 10;
  Points[0].y := 10;
  Points[1].x := 20;
  Points[1].y := 20;
  Points[2].x := 30;
  Points[2].y := 30;
end. 
Da bekomme ich den Hinweis

Code: Alles auswählen

project1.lpr(10,19) Hint: Variable "Points" of a managed type does not seem to be initialized
SetLength macht doch eben diese Initialisierung.

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

Re: Wieso kommt dieser Compilerhinweis?

Beitrag von Mathias »

So sollte die Warnung weg sein,

Code: Alles auswählen

var Points : array of TPoint = nil;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Wieso kommt dieser Compilerhinweis?

Beitrag von fliegermichl »

Mathias hat geschrieben: Di 15. Sep 2026, 13:29 So sollte die Warnung weg sein,

Code: Alles auswählen

var Points : array of TPoint = nil;
Ja natürlich. Sollte der Compiler nicht aber "wissen", dass SetLength eben diese Initialisierung durchführt?

Benutzeravatar
Zvoni
Beiträge: 735
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Wieso kommt dieser Compilerhinweis?

Beitrag von Zvoni »

Mathias hat geschrieben: Di 15. Sep 2026, 13:29 So sollte die Warnung weg sein,

Code: Alles auswählen

var Points : array of TPoint = nil;
Aber dann widerspricht sich die Dokumentation irgendwie
https://www.freepascal.org/daily/doc/rt ... types.html
Are implicitly initialized at the beginning of their scope. Usually this means the memory area reserved for them is zeroed out.
*schnipp*
Dynamic arrays
Are reference counted.
Was nu?
Wird das Ding jetzt implizit initialisiert oder nicht?

Oder gehts eher darum, dass die Variable selbst eigentlich ein Zeiger ist?
Weil nur dann ergibt das was Mathias geschrieben hat Sinn
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7444
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wieso kommt dieser Compilerhinweis?

Beitrag von af0815 »

... RTFM ... dann wird es undurchsichtig. Zvoni hat da recht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Wieso kommt dieser Compilerhinweis?

Beitrag von Warf »

Die Warnungen für managed variablen sind etwas irreführend.
Managed typen werden (fast) immer initialisiert das muss man nicht manuell machen, im Gegenteil, bei managed records kann eine Initialisierung sogar beliebig Komplexität hinzufügen. In FPC 3.2.x ist die Initialisierung über Default allerdings auch broken das wenn man die warning loswerden will man potentiell mehr kaputt macht.

Die Ausnahme für die Initialisierung (oben das "fast immer") ist für dynamische arrays und strings die das result einer Funktion sind, diese werden nicht initialisiert.

Code: Alles auswählen

function foo: String;
begin
  Result += 'A';
end;

var s: String;
begin
  s:=foo; // A
  s:=foo; // AA
  s:=foo; // AAA
  writeLn(s);
end.
Managed records werden hingegen korrekt initialisiert.

Bzg SetLength als Initialisierung, der Grund dafür ist das SetLength den parameter als "var" und nicht als "out" behandelt.

Antworten