Var Parameter erzeugt Warning

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
alfware17
Beiträge: 191
Registriert: Di 14. Dez 2010, 23:27

Var Parameter erzeugt Warning

Beitrag von alfware17 »

Ich habe einige Methoden, wo ich - weil die Funktionstypen zu komplex oder nicht erlaubt sind in Turbo-Pascal - die Ausgabe so organisiere:

Code: Alles auswählen

procedure Summe(a,b: integer; var c: integer);
begin
    c:= a+b;
end;
Nun rufe ich das auf

Code: Alles auswählen

var s: integer;
summe(2, 3, s);
Der Compiler sagt mir: Hint: local variable s seems to be not initialized. Was im Prinzip auch zutreffend aber nervig ist, weil ich hundert solche Fälle habe. Natürlich kann ich s:=0; schreiben vorher, aber manchmal ist das s doch komplexer und außerdem ist das auch nervig. Bleibt mir nur, den entsprechenden Hint ganz zu unterdrücken? Manchmal macht man ja Fehler und will dann doch sowas sehen. Aber kann der Compiler nicht erkennen, daß es NUR ein Ausgabe-Parameter ist?

Benutzeravatar
theo
Beiträge: 10753
Registriert: Mo 11. Sep 2006, 19:01

Re: Var Parameter erzeugt Warning

Beitrag von theo »


Benutzeravatar
Zvoni
Beiträge: 268
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Var Parameter erzeugt Warning

Beitrag von Zvoni »

Code: Alles auswählen

var s: integer=0; //<----
summe(2, 3, s);
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.

alfware17
Beiträge: 191
Registriert: Di 14. Dez 2010, 23:27

Re: Var Parameter erzeugt Warning

Beitrag von alfware17 »

Danke für eure Tips, ich kann sie nur leider so nicht umsetzen, da Turbo-Pascal (stand im Text).
Um die Kompatibilität zu wahren und mir andererseits den Hint zu ersparen, werde ich wohl an sowas denken müssen:

Code: Alles auswählen

procedure summe(a, b: integer; {$ifdef dos} var {$else} out {$endif} s: integer); 
Suche ich nur noch ein Programm welches mir das für alle oder einige Quelltexte verlustfrei ändert...

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

Re: Var Parameter erzeugt Warning

Beitrag von fliegermichl »

Du brauchst doch die Variable nur zu initialisieren. Dann erscheint keine Warnung mehr.

Code: Alles auswählen

procedure summe(a, b : integer; var s : integer);
begin
 s := a+b;
end;

var s : integer;
begin
 s := 0;
 summe(3, 4, s);
end.

alfware17
Beiträge: 191
Registriert: Di 14. Dez 2010, 23:27

Re: Var Parameter erzeugt Warning

Beitrag von alfware17 »

fliegermichl hat geschrieben: Mi 29. Jan 2025, 14:04 Du brauchst doch die Variable nur zu initialisieren. Dann erscheint keine Warnung mehr.

Code: Alles auswählen

procedure summe(a, b : integer; var s : integer);
begin
 s := a+b;
end;

var s : integer;
begin
 s := 0;
 summe(3, 4, s);
end.
Das mag für Integer schon stimmen - aber was ist, wenn s ein komlexerer Typ ist zB ein Record? Irgendwann mal werde ich speziell dieses Projekt auch nach OO umstellen und dann kann ich mir die VAR sparen weil ich die Ergebnisse dann als Klassenattribute halte, aber solange...

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 312
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Var Parameter erzeugt Warning

Beitrag von Jorg3000 »

Hi!
Man kann Hinweise inline für einen Abschnitt (hier einzelne Zeile) abschalten, wenn man sich sicher ist, dass Hinweise überflüssig sind ...

Code: Alles auswählen

{$HINTS OFF} summe(3, 4, s); {$HINTS ON}
Zuletzt geändert von Jorg3000 am Mi 29. Jan 2025, 16:24, insgesamt 1-mal geändert.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 312
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Var Parameter erzeugt Warning

Beitrag von Jorg3000 »

PS:
Ich sehe gerade, dass man auch gezielt nur die Warnung "nicht initialisiert" abschalten kann.
Alle anderen Hinweise/Warnungen bleiben aktiv.
Grüße, Jörg

Code: Alles auswählen

 {$WARN 5057 OFF} summe(3, 4, s); {$WARN 5057 ON} 

braunbär
Beiträge: 462
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: Var Parameter erzeugt Warning

Beitrag von braunbär »

Was eine gute Sache wäre: Wenn die Out-Parameter der Free-Pascal runtime als solche und nicht als var-Parameter deklariert wären. Viele Parameter von Free Pascal Runtime.Prozeduren, die reine Ausgabe-Parameter sind, sind als var deklariert und produzieren diese Warnung, wenn man sie - völlig korrekt - uninitialisiert verwendet.

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

Re: Var Parameter erzeugt Warning

Beitrag von Mathias »

Ich habe einige Methoden, wo ich - weil die Funktionstypen zu komplex oder nicht erlaubt sind in Turbo-Pascal - die Ausgabe so organisiere:
Das es Result in TP nicht gab, kann ich mir vorstellen, aber folgendes sollte gehen:

Code: Alles auswählen

  function Test(a, b: integer): integer;
  begin
    Test := a + b;
  end;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

alfware17
Beiträge: 191
Registriert: Di 14. Dez 2010, 23:27

Re: Var Parameter erzeugt Warning

Beitrag von alfware17 »

Mathias hat geschrieben: Mi 29. Jan 2025, 17:47
Ich habe einige Methoden, wo ich - weil die Funktionstypen zu komplex oder nicht erlaubt sind in Turbo-Pascal - die Ausgabe so organisiere:
Das es Result in TP nicht gab, kann ich mir vorstellen, aber folgendes sollte gehen:

Code: Alles auswählen

  function Test(a, b: integer): integer;
  begin
    Test := a + b;
  end;  
Es geht darum, wenn der Ergebnistyp kein einfacher Typ sein soll sondern zB ein record oder ein anderer selbsterstellter Typ.

Freepascal erlaubt:

Code: Alles auswählen

function Konvertiere(x.y : String): TAdresse;
Turbo-Pascal aber nicht, man muß sich so behelfen:

Code: Alles auswählen

procedure Konvertiere(x,y : String; var ergebnis: TAdresse);
oder anderen Anwendungsfall, da ich vermehrt aus Python solche Ungetüme wie

Code: Alles auswählen

a, b = berechne (x. y)
umwandeln muß was nicht anders geht als

Code: Alles auswählen

procedure berechne(x,y : integer; var a, b: integer);
wobei man sich in Freepascal noch was basteln könnte, das a und b enthält.

Nun möchte ich aber TAdresse oder (a,b) nicht immer per Hand initialisieren, auch fehlt wieder das default...

Also bleibt für mich als kleinestes Übel die bedingte Compilierung, das mache ich eh oft.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 312
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Var Parameter erzeugt Warning

Beitrag von Jorg3000 »

Was ist denn mit dem o.g. {$HINTS OFF} oder {$WARN 5057 OFF} , kommt das nicht in Frage?

alfware17
Beiträge: 191
Registriert: Di 14. Dez 2010, 23:27

Re: Var Parameter erzeugt Warning

Beitrag von alfware17 »

Jorg3000 hat geschrieben: Do 30. Jan 2025, 00:35 Was ist denn mit dem o.g. {$HINTS OFF} oder {$WARN 5057 OFF} , kommt das nicht in Frage?
Doch schon, aber...
Wenn ich was dazuschreiben muß bei jedem Aufruf, dann ist das mehr als wenn ich es bei der Deklaration dazuschreiben muß (wenn 1..N Aufrufe). Da wäre ein

Code: Alles auswählen

procedure berechne(x,y: String; {$ifdef dos} var {$else} out {$endif} a, b: integer);
schon ökonomischer und ich bin es auch gewohnt. Da ich viel Code zwar erst in Lazarus schreibe und dann nachschaue, was sagt Turbo-Pascal dazu, generell aber schon mal mitplane, was alles an Einschränkungen bzw dann Varianten wartet. Schönes Beispiel neulich mein Stack, wo ich unbedingt ein ganzes 16x16 Sudoku unterbringen wollte. In Lazarus, so riet mir ChatGpt war es einfach ein generischer Stack. Die Unit dazu wurde dann aber mit bedingter Compilierung dann doch sehr bunt und der Aufruf im Hauptprogramm nochmal mit bedingter Compilierung.

Benutzeravatar
Zvoni
Beiträge: 268
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Var Parameter erzeugt Warning

Beitrag von Zvoni »

alfware17 hat geschrieben: Do 30. Jan 2025, 10:14
Jorg3000 hat geschrieben: Do 30. Jan 2025, 00:35 Was ist denn mit dem o.g. {$HINTS OFF} oder {$WARN 5057 OFF} , kommt das nicht in Frage?
Doch schon, aber...
Wenn ich was dazuschreiben muß bei jedem Aufruf, dann ist das mehr als wenn ich es bei der Deklaration dazuschreiben muß (wenn 1..N Aufrufe). Da wäre ein

Code: Alles auswählen

procedure berechne(x,y: String; {$ifdef dos} var {$else} out {$endif} a, b: integer);
schon ökonomischer und ich bin es auch gewohnt. Da ich viel Code zwar erst in Lazarus schreibe und dann nachschaue, was sagt Turbo-Pascal dazu, generell aber schon mal mitplane, was alles an Einschränkungen bzw dann Varianten wartet. Schönes Beispiel neulich mein Stack, wo ich unbedingt ein ganzes 16x16 Sudoku unterbringen wollte. In Lazarus, so riet mir ChatGpt war es einfach ein generischer Stack. Die Unit dazu wurde dann aber mit bedingter Compilierung dann doch sehr bunt und der Aufruf im Hauptprogramm nochmal mit bedingter Compilierung.
Da würde ich dann aber global ein {$WARN 5057 OFF} setzen, und Feierabend.
Vorausgesetzt du weisst was du tust.

Andererseits verstehe ich auch nicht, was an den Hints so schlimm ist.
Kann ja durchaus hilfreich beim debugging sein.
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
theo
Beiträge: 10753
Registriert: Mo 11. Sep 2006, 19:01

Re: Var Parameter erzeugt Warning

Beitrag von theo »

Zvoni hat geschrieben: Do 30. Jan 2025, 10:31 Andererseits verstehe ich auch nicht, was an den Hints so schlimm ist.
Ich verstehe auch nicht, warum sich die Leute immer so an diesen Hints abarbeiten.
Das sind ja noch nicht einmal Warnungen. Im Prinzip ist das Geschwätz.

Wenn man die nicht sehen will, kann man sie auch einfach im Nachrichtenfenster raus filtern.
Dateianhänge
nohints.png
nohints.png (72.03 KiB) 1036 mal betrachtet

Antworten