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.