Compiler-Warnung: nicht initialisierte Variable

Für Fragen rund um die Ide und zum Debugger
Antworten
siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Compiler-Warnung: nicht initialisierte Variable

Beitrag von siro »

Hallo, ich habe eine identische Meldung und wollte deshalb keinen neuen Thread aufmachen.
Bei der Suche landete ich ja hier :?

Ich bekomme immer eine Meldung wenn ich eine Variable Übergebe, dass diese nicht initialisiert wurde.
Das braucht sie ja auch nicht, da die aufgerufene Funktion dies tut. Die Funktion hat einen var Parameter
So habe ich in den Meldungen den Haken rausgenommen, das ändert aber nichts.
Kann man da noch etwas umstellen ?

Das tut ja nicht weh, aber bei Var Parametern würde ich das gern keine Meldung bekommen.

Ich danke Euch für Infos:

Init_01.jpg


Init_02.jpg
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Compiler-Warnung: nicht initialisierte Variable

Beitrag von m.fuchs »

siro hat geschrieben:Hallo, ich habe eine identische Meldung und wollte deshalb keinen neuen Thread aufmachen.

Schlechte Idee: der alte Thread ist von 2008 und es ist eben keine identische Meldung. Ich hab das mal in ein neues Thema verschoben.


siro hat geschrieben:Ich bekomme immer eine Meldung wenn ich eine Variable Übergebe, dass diese nicht initialisiert wurde.
[...]
Das tut ja nicht weh, aber bei Var Parametern würde ich das gern keine Meldung bekommen.

Initialisiere die Variabel doch ganz einfach.

Code: Alles auswählen

var
  value: Integer = 0;
begin
  Getv(value);
end;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: nochmal ne Warnung des Kompilers

Beitrag von wp_xyz »

Der Compiler "denkt" da einfach zuwenig: Wenn ein Prozedur-Parameter als var deklariert ist, heißt das, dass die Variable sowohl für Ein- als auch Ausgabe verwendbar ist. Wenn in der aufrufenden Routine keine Wertzuweisung erfolgt, ist der Parameter als Eingabe-Parameter undefiniert. Dass du die Eingabemöglichkeit gar nicht ausnützt, spielt keine Rolle - das "weiß" der Compiler offenbar nicht, es müsste eine tiefergehende Analyse durchgeführt werden, und wir alle würden uns wundern, warum ein Compiliervorgang so lange dauert.

Wenn du stattdessen den Parameter als "out" deklarierst, ist klar, dass der Eingabewert ignoriert werden soll und nur der Ausgabewert eine Rolle spielt, und die Warnung bleibt aus:

Code: Alles auswählen

procedure Getv(out x: Integer);
begin
  x := 1234;
end;

Leider gibt es in den nicht selbst-geschriebenen Prozeduren immer wieder Fälle, bei denen eigentlich "out" benötigt, aber "var" verwendet wird. Um nicht von zu vielen zu ignorierenden Meldungen überschwemmt zu werden, gibt es im Nachrichten-Fenster die Möglichkeit, auf der entsprechenden Meldungszeile rechts zu klicken und den Punkt "Hide message by inserting IDE directive {%H-}" anzuwählen - damit wird in der Deklaration des Parameters ein {%H-} vorangestellt und die Meldung unterdrückt.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Compiler-Warnung: nicht initialisierte Variable

Beitrag von wp_xyz »

m.fuchs hat geschrieben:
siro hat geschrieben:Ich hab das mal in ein neues Thema verschoben.

Wer zu spät kommt, ... Meine Antwort steht in dem anderen Thread.

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: nochmal ne Warnung des Kompilers

Beitrag von siro »

Die Variable kann ich natürlich initialisieren, aber das ist ja nicht Sinn der Sache, frisst zu viel Code :lol:
Spass beiseite:

Ich pack mal die Antwort von wp_xyz hier mit rein, weil da ist richtig viel GUTE INFO drin:
Hab vielen Dank dafür:

Der Compiler "denkt" da einfach zuwenig: Wenn ein Prozedur-Parameter als var deklariert ist, heißt das, dass die Variable sowohl für Ein- als auch Ausgabe verwendbar ist.
Wenn in der aufrufenden Routine keine Wertzuweisung erfolgt, ist der Parameter als Eingabe-Parameter undefiniert. Dass du die Eingabemöglichkeit gar nicht ausnützt,
spielt keine Rolle - das "weiß" der Compiler offenbar nicht, es müsste eine tiefergehende Analyse durchgeführt werden, und wir alle würden uns wundern,
warum ein Compiliervorgang so lange dauert.

Wenn du stattdessen den Parameter als "out" deklarierst, ist klar, dass der Eingabewert ignoriert werden soll und nur der Ausgabewert eine Rolle spielt, und die Warnung bleibt aus:

Code: Alles auswählen

procedure Getv(out x: Integer);
begin
x := 1234;
end;


Leider gibt es in den nicht selbst-geschriebenen Prozeduren immer wieder Fälle, bei denen eigentlich "out" benötigt, aber "var" verwendet wird.
Um nicht von zu vielen zu ignorierenden Meldungen überschwemmt zu werden, gibt es im Nachrichten-Fenster die Möglichkeit,
auf der entsprechenden Meldungszeile rechts zu klicken und den Punkt "Hide message by inserting IDE directive {%H-}" anzuwählen
- damit wird in der Deklaration des Parameters ein {%H-} vorangestellt und die Meldung unterdrückt.



Das Schlüsselwort out kannte ich überhaupt noch nicht und das stellt natürlich eine
"sehr saubere Lösung" dar. Das werde ich ab sofort so übernehmen.

Dann habt ein geruhsames Wochenende.
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Compiler-Warnung: nicht initialisierte Variable

Beitrag von siro »

Die Variable kann ich natürlich initialisieren, aber das ist ja nicht Sinn der Sache, frisst zu viel Code :lol:
Spass beiseite:

Ich pack mal die Antwort von wp_xyz hier mit rein, weil da ist richtig viel GUTE INFO drin:
Hab vielen Dank dafür:

Der Compiler "denkt" da einfach zuwenig: Wenn ein Prozedur-Parameter als var deklariert ist, heißt das, dass die Variable sowohl für Ein- als auch Ausgabe verwendbar ist.
Wenn in der aufrufenden Routine keine Wertzuweisung erfolgt, ist der Parameter als Eingabe-Parameter undefiniert. Dass du die Eingabemöglichkeit gar nicht ausnützt,
spielt keine Rolle - das "weiß" der Compiler offenbar nicht, es müsste eine tiefergehende Analyse durchgeführt werden, und wir alle würden uns wundern,
warum ein Compiliervorgang so lange dauert.

Wenn du stattdessen den Parameter als "out" deklarierst, ist klar, dass der Eingabewert ignoriert werden soll und nur der Ausgabewert eine Rolle spielt, und die Warnung bleibt aus:

Code: Alles auswählen

procedure Getv(out x: Integer);
begin
x := 1234;
end;


Leider gibt es in den nicht selbst-geschriebenen Prozeduren immer wieder Fälle, bei denen eigentlich "out" benötigt, aber "var" verwendet wird.
Um nicht von zu vielen zu ignorierenden Meldungen überschwemmt zu werden, gibt es im Nachrichten-Fenster die Möglichkeit,
auf der entsprechenden Meldungszeile rechts zu klicken und den Punkt "Hide message by inserting IDE directive {%H-}" anzuwählen
- damit wird in der Deklaration des Parameters ein {%H-} vorangestellt und die Meldung unterdrückt.



Das Schlüsselwort out kannte ich überhaupt noch nicht und das stellt natürlich eine
"sehr saubere Lösung" dar. Das werde ich ab sofort so übernehmen.

Dann habt ein geruhsames Wochenende.
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Antworten