Warnung bei FillByte

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

Warnung bei FillByte

Beitrag von Mathias »

Code: Alles auswählen

procedure test;
var
  Data: array [0..255] of byte;
begin
  FillByte(Data, SizeOf(Data),$00);
end;     
Wieso kommt hier folgende Warnung ?

Code: Alles auswählen

project1.lpr(7,16) Hint: Local variable "Data" does not seem to be initialized
Ich initialisiere doch Data mit FillByte.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Warnung bei FillByte

Beitrag von theo »

Ein Hint ist keine Warnung sondern ein Hinweis. Das ist nicht das Gleiche. Warnungen gibt es auch, die sind etwas ernster, aber auch noch keine Errors, wenn man weiss, was man tut.
Ich weiss nicht, warum er den Hinweis bringt, aber allgemein sollte man sich mit Hinweisen nicht abmühen.
Einfach vergessen.

Stevie
Beiträge: 175
Registriert: Di 27. Feb 2024, 22:40

Re: Warnung bei FillByte

Beitrag von Stevie »

Also ich habe Deine Prozedur gerade mal in ein kleines Dummy-Programm verpackt und dann sowohl mit einer 3.2.0 also auch mit einem Trunk-FPC übersetzt und bei beiden bekomme ich dasselbe Ergebnis:

Code: Alles auswählen

program a;

procedure test;
var
  Data: array [0..255] of byte;
begin
  FillByte(Data, SizeOf(Data),$00);
end;

begin
 test;
end.
... übersetzt ohne Probleme mit ...

Code: Alles auswählen

$ fpc a.pas
Free Pascal Compiler version 3.2.0 [2020/06/27] for x86_64
Copyright (c) 1993-2020 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling a.pas
Linking a
12 lines compiled, 0.4 sec
$
Benutzt Du eventuell eine deutlich ältere FPC-Version?

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

Re: Warnung bei FillByte

Beitrag von Mathias »

Benutzt Du eventuell eine deutlich ältere FPC-Version?
Nein, eine brandneu.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Warnung bei FillByte

Beitrag von wp_xyz »

Der erste Parameter in FillByte, dein "Data", ist ein "var" Parameter. Das signalisiert, dass die aufgerufene Funktion den Wert lesen und schreiben kann. Falls Data gelesen wird, (was hier natürlich nicht der Fall ist), fällt dem compiler auf, dass Data keinen wohldefinierten Wert hat, denn an Data ist von der aufrufenden Funktion nichts zugewiesen worden. Daher der Hinweis.

Es würde helfen, den Parameter in FillByte mit "out" zu deklarieren (kann man natürlich nicht ohne die FPC Routine zu ändern), denn dann wird für Data kein Eingabewert erwartet/benötigt.

Oder du initialisierst den Parameter. Das geht oft am einfachsten gleich bei der Deklaration. Ist der var-Parameter z.B. ein String, kann man den bei der Deklaration auf '' setzen, bei Zahlen auf 0, bei Pointern oder dynamischen Arrays auf nil:

Code: Alles auswählen

program Project1;

procedure ExtractNumber(var s: String);
var
  i: Integer;
begin
  i := Length(s);
  while i > 0 do
  begin
    if not (s[i] in ['0'..'9']) then
      Delete(s, i, 1);
    dec(i);
  end;
end;

var
  s: String = '';
begin
  ExtractNumber(s);
end.  
Bei "Data: array[0..255] of byte" geht das nicht, da würde ich auf den Hint rechts-klicken und die Option zum Ignorieren der Meldung auswählen.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2826
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: Warnung bei FillByte

Beitrag von m.fuchs »

wp_xyz hat geschrieben: Mi 10. Apr 2024, 20:22 Bei "Data: array[0..255] of byte" geht das nicht, da würde ich auf den Hint rechts-klicken und die Option zum Ignorieren der Meldung auswählen.
Also gehen tut das schon:

Code: Alles auswählen

var
  Data: array [0..255] of byte = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 
Aber ob sich das jetzt lohnt, nur um den Hint nicht zu sehen?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Stevie
Beiträge: 175
Registriert: Di 27. Feb 2024, 22:40

Re: Warnung bei FillByte

Beitrag von Stevie »

Also gehen tut das schon:
...
Wäre es da nicht einfacher, folgendes zu machen:

Code: Alles auswählen

procedure test;
var
  Data: array [0..255] of byte;
begin
 Data[0]:=0;    // <--- neu
 FillByte(Data, SizeOf(Data),$00);
end;
Auch dann sollte doch der Hint verschwinden, weil Data ja somit (ein bisschen) initialisiert ist. Und da direkt danach das FillByte(...) kommt, ist es auch nicht gefährlich.

Mich würde aber eher mal interessieren, warum der Hint bei Mathias auftaucht, bei mir aber bspw. nicht. Bin ich denn der einzige, der den Hint nicht bekommt?

wennerer
Beiträge: 623
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Warnung bei FillByte

Beitrag von wennerer »

Hast du hier einen Haken:
Hinweis.png
Hinweis.png (109.22 KiB) 6998 mal betrachtet
Viele Grüße
Bernd

Stevie
Beiträge: 175
Registriert: Di 27. Feb 2024, 22:40

Re: Warnung bei FillByte

Beitrag von Stevie »

Hast du hier einen Haken:
Jop, stimmt, das ist bei Aufruf per Kommandozeile nicht der Fall und da ich das auch nicht in der .fpc.cfg habe, ist das mal die Antwort auf meine eigene Frage.Und in dem Zusammenhang konnte ich auch gleich testen (und bestätigen), dass mein ...

Code: Alles auswählen

Data[0] := 0
... den Hint aufhebt. :-)

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

Re: Warnung bei FillByte

Beitrag von wp_xyz »

Stevie hat geschrieben: Mi 10. Apr 2024, 21:04

Code: Alles auswählen

procedure test;
var
  Data: array [0..255] of byte;
begin
 Data[0]:=0;    // <--- neu
 FillByte(Data, SizeOf(Data),$00);
end;
Könnte sein, dass nun ein Hint kommt a la "Not all elements initialized"...

Wenn "array[0..255] of byte" ein eigener Typ wäre, z.B. TByteArray256, dann könnte man das Folgende machen:

Code: Alles auswählen

type
  TByteArray256 = array[0..255] of Byte;
var
  Data: TByteArray256;
begin
  Data := Default(TByteArray256);
  FillByte(Data, SizeOf(Data), 0);

Stevie
Beiträge: 175
Registriert: Di 27. Feb 2024, 22:40

Re: Warnung bei FillByte

Beitrag von Stevie »

Bei mir kommt nach der Initialisierung des ersten Element des Arrays tatsächlich gar kein Hint mehr. So weit geht die Fürsorge des Compilers dann doch nicht. :-)

Das komplette 'Reinigen' mit Default ist aber auf jeden Fall besser.

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

Re: Warnung bei FillByte

Beitrag von Mathias »

wp_xyz hat geschrieben: Mi 10. Apr 2024, 22:42 Wenn "array[0..255] of byte" ein eigener Typ wäre, z.B. TByteArray256, dann könnte man das Folgende machen:

Code: Alles auswählen

type
  TByteArray256 = array[0..255] of Byte;
var
  Data: TByteArray256;
begin
  Data := Default(TByteArray256);
  FillByte(Data, SizeOf(Data), 0);
Könnte man da nicht das FillChar weglassen, ausser man will was anderes als $00 ?


Was noch echt cool wäre, wen es sowas in dieser Art geben würde:

Code: Alles auswählen

type
  Tvec=array[0..2] of Single = default(1, 0, 0);
var
  vec:Tvec;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Warnung bei FillByte

Beitrag von Mathias »

Bei "Data: array[0..255] of byte" geht das nicht, da würde ich auf den Hint rechts-klicken und die Option zum Ignorieren der Meldung auswählen.
Schon wieder was neues gelernt, das mit den Rechtsklick kannte ich nicht, habe bis jetzt immer manuell das {%H-} eingefügt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 966
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Warnung bei FillByte

Beitrag von PascalDragon »

wp_xyz hat geschrieben: Mi 10. Apr 2024, 20:22 Es würde helfen, den Parameter in FillByte mit "out" zu deklarieren (kann man natürlich nicht ohne die FPC Routine zu ändern), denn dann wird für Data kein Eingabewert erwartet/benötigt.
Es ist aus zwei Gründen ein var- und kein out-Parameter:
  • historisch / Rückwärtskompatibilität
  • ein out würde tatsächlich zu mehr Problemen führen (es gab da Mal vor langer Zeit einen Mailing List Thread dazu, wo Jonas das erklärt hat, den müsste ich aber erstmal finden...)
FPC Compiler Entwickler

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

Re: Warnung bei FillByte

Beitrag von wp_xyz »

Mathias hat geschrieben: Do 11. Apr 2024, 17:07
wp_xyz hat geschrieben: Mi 10. Apr 2024, 22:42 Wenn "array[0..255] of byte" ein eigener Typ wäre, z.B. TByteArray256, dann könnte man das Folgende machen:

Code: Alles auswählen

type
  TByteArray256 = array[0..255] of Byte;
var
  Data: TByteArray256;
begin
  Data := Default(TByteArray256);
  FillByte(Data, SizeOf(Data), 0);
Könnte man da nicht das FillChar weglassen, ausser man will was anderes als $00 ?
Natürlich.

Mathias hat geschrieben: Do 11. Apr 2024, 17:07 Was noch echt cool wäre, wen es sowas in dieser Art geben würde:

Code: Alles auswählen

type
  Tvec=array[0..2] of Single = default(1, 0, 0);
var
  vec:Tvec;   
Auf meiner Wunschliste wäre, das "Default" direkt bei der deklaration einsetzen zu können:

Code: Alles auswählen

type
  TData = record
    Name: String;
    X, Y: Integer;
    Description: String;
  end;
  
var
  Data: TData = default;  

Antworten