uvectormath.pas(873,19) Warning: function result variable of a managed type does not seem to be initialized

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

uvectormath.pas(873,19) Warning: function result variable of a managed type does not seem to be initialized

Beitrag von corpsman »

Servus,

bisher habe ich das immer so geschrieben.

Code: Alles auswählen

Function ZeroNxM(Cols, Rows: integer): TMatrixNxM;
Var
  i, j: Integer;
Begin
  // Wenn man Result := nil vorher schreibt ist die Warnung weg
  setlength(result, cols, Rows);
  For i := 0 To cols - 1 Do Begin
    For j := 0 To Rows - 1 Do Begin
      result[i, j] := 0;
    End;
  End;
End;  
Seit neuestem kommt da aber dann die Warnung:
uvectormath.pas(873,19) Warning: function result variable of a managed type does not seem to be initialized
Im Kommentar habe ich die Lösung, das vorher explizit auf NIL zu setzen (dann geht zumindest die Warnung weg)

Wie seht ihr das, soll ich die Warnung einfach Ignorieren, vorher explizit auf NIl setzen, oder gibt es noch einen anderen besseren Weg ?

Hätte ich Setlength selbst geschrieben, würde ich das nicht als Var sondern als Out schreiben, dann wäre die Warnung auch weg ...
--
Just try it

PascalDragon
Beiträge: 825
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: uvectormath.pas(873,19) Warning: function result variable of a managed type does not seem to be initialized

Beitrag von PascalDragon »

corpsman hat geschrieben:
Mo 15. Feb 2021, 09:11
Servus,

bisher habe ich das immer so geschrieben.

Code: Alles auswählen

Function ZeroNxM(Cols, Rows: integer): TMatrixNxM;
Var
  i, j: Integer;
Begin
  // Wenn man Result := nil vorher schreibt ist die Warnung weg
  setlength(result, cols, Rows);
  For i := 0 To cols - 1 Do Begin
    For j := 0 To Rows - 1 Do Begin
      result[i, j] := 0;
    End;
  End;
End;  
Seit neuestem kommt da aber dann die Warnung:
uvectormath.pas(873,19) Warning: function result variable of a managed type does not seem to be initialized
Im Kommentar habe ich die Lösung, das vorher explizit auf NIL zu setzen (dann geht zumindest die Warnung weg)

Wie seht ihr das, soll ich die Warnung einfach Ignorieren, vorher explizit auf NIl setzen, oder gibt es noch einen anderen besseren Weg ?
Ich nehme mal an dein TMatrixNxM ist ein zweidimensionales dynamisches Array?

Die Warnung ist an sich korrekt, da durch die Art wie verwaltete Rückgabewerte (dynamische Arrays, Strings) übergeben werden (nämlich als versteckter Parameter) kann es vorkommen, dass Result bereits einen gültigen Wert enthält. Wenn du nun die Größe änderst (zum Beispiel größer als was übergeben wurde), aber nicht alle Felder setzt (wie du es machst), dann stehen in dem ursprünglichen Bereich noch immer die ursprünglichen Daten drin.

Wenn du die Result-Variable auf Nil setzt, dann stellst du tatsächlich sicher, dass alles weg ist. In deinem Fall ist das aber tatsächlich unnötig und du kannst die Warnung einfach für diesen Bereich deaktivieren:

Code: Alles auswählen

Begin
  // Wenn man Result := nil vorher schreibt ist die Warnung weg
  {$push}
  {$warn 5093 off}
  setlength(result, cols, Rows);
  {$pop}
  For i := 0 To cols - 1 Do Begin
Die Nummer findest du, indem du mit -vq kompilierst.
corpsman hat geschrieben:
Mo 15. Feb 2021, 09:11
Hätte ich Setlength selbst geschrieben, würde ich das nicht als Var sondern als Out schreiben, dann wäre die Warnung auch weg ...
Nein, da SetLength es eben erlaubt die Länge eines existierenden Arrays oder Strings zu ändern mit einem out-Parameter würdest du immer mit einem leeren Array/String beginnen.
FPC Compiler Entwickler

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: uvectormath.pas(873,19) Warning: function result variable of a managed type does not seem to be initialized

Beitrag von corpsman »

ok den Fall das ich ein bestehendes Array im nachhinein ändere hatte ich übersehen, ich nutze das extrem selten ;)

Das Unterdrücken der Warnungen kannte ich so noch nicht.

Da ich das aber extrem oft in meinem Code habe tendiere ich dazu das Result := nil zu setzen (weil weniger Schreibarbeit :oops: )

Da Spricht dann aber auch nix dagegen, wenn ich deinen Post richtig verstanden habe ..
--
Just try it

PascalDragon
Beiträge: 825
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: uvectormath.pas(873,19) Warning: function result variable of a managed type does not seem to be initialized

Beitrag von PascalDragon »

corpsman hat geschrieben:
Mo 15. Feb 2021, 09:49
Da ich das aber extrem oft in meinem Code habe tendiere ich dazu das Result := nil zu setzen (weil weniger Schreibarbeit :oops: )

Da Spricht dann aber auch nix dagegen, wenn ich deinen Post richtig verstanden habe ..
Korrekt, es spricht nichts dagegen. Es hat halt nur den Effekt, dass der Speicher freigegeben und wieder angefordert wird. Wenn allerdings die Anzahl die Zeilen und Spalten gleich bleibt, dann würde SetLength allein den Speicher einfach behalten, die Operation wäre also effektiver.
FPC Compiler Entwickler

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: uvectormath.pas(873,19) Warning: function result variable of a managed type does not seem to be initialized

Beitrag von corpsman »

hmm bei den allermeisten stellen wird das mitt setlength initilisiert so wie in meinem Beispiel. Da müsste es dann ja passen ...
--
Just try it

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: uvectormath.pas(873,19) Warning: function result variable of a managed type does not seem to be initialized

Beitrag von af0815 »

corpsman hat geschrieben:
Mo 15. Feb 2021, 20:25
hmm bei den allermeisten stellen wird das mitt setlength initilisiert so wie in meinem Beispiel. Da müsste es dann ja passen ...
Sicher, aber der Compiler kann nicht feststellen, ob du so es gemeint hast, oder das Array vorher einfach vergessen hast zu initialisieren. Für den Compiler wäre das ein Ratespiel, deswegen mekert es das an. Du hast es in der Hand zu sagen, passt oder halte den Mund :mrgreen:
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

PascalDragon
Beiträge: 825
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: uvectormath.pas(873,19) Warning: function result variable of a managed type does not seem to be initialized

Beitrag von PascalDragon »

corpsman hat geschrieben:
Mo 15. Feb 2021, 20:25
hmm bei den allermeisten stellen wird das mitt setlength initilisiert so wie in meinem Beispiel. Da müsste es dann ja passen ...
Es kommt auf die Situation an:

Code: Alles auswählen

program tarrtest;

{$mode objfpc}{$H+}

type
  TLongIntArray = array of LongInt;

function Test1: TLongIntArray;
begin
  Result := [1, 2, 3];
end;

function Test2: TLongIntArray;
begin
  Writeln(Length(Result));
  SetLength(Result, 5);
end;

procedure DumpArray(aArr: array of LongInt);
var
  i: LongInt;
begin
  for i in aArr do
    Write(i, ' ');
  Writeln;
end;

var
  t: TLongIntArray;
begin
  t := Test1;
  DumpArray(t);
  t := Test2;
  DumpArray(t);
end.
Zumindest unter i386-win32 und x86_64-win64 mit FPC 3.2.0 die Ausgabe ist wie folgt:

Code: Alles auswählen

1 2 3
3
1 2 3 0 0
Wenn du also zum Beispiel implizit erwartest, dass alle Elemente 0 sind (was bei den hinzugefügten Elementen garantiert ist), dann ergibt das Probleme für dich. Wenn du Result auf Nil setzt, dann ist auf jeden Fall Ruhe. Wenn du alle Element eh manuell setzt, dann hast du ebenfalls kein Problem.
FPC Compiler Entwickler

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: uvectormath.pas(873,19) Warning: function result variable of a managed type does not seem to be initialized

Beitrag von corpsman »

Danke für die Erläuterung,
ich gehe Grundsätzlich davon aus, das uninitialisierte Variablen den Wert beinhalten der mir nicht gefällt und schreibe jedes Feld auf einen explizit Defaultwert.
--
Just try it

Antworten