Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Variable ist möglicherweise nicht initialisiert worden (https://www.delphipraxis.net/166631-variable-ist-moeglicherweise-nicht-initialisiert-worden.html)

Looper 22. Feb 2012 13:43

Delphi-Version: XE2

Variable ist möglicherweise nicht initialisiert worden
 
Hey,
ich habe mal ne Frage zu der Compilerwarnung:
[DCC Warnung] QixList.pas(51): W1036 Variable 'help' ist möglicherweise nicht initialisiert worden

Delphi-Quellcode:
function AddSpark(aData : TSpark) : EList;
var
  help : PSparkList;
begin
  AddSpark := LOK;
  try
    new(help); inc(booked);
    help^.Data := aData;
    help^.pNext := pRoot;
    pRoot := help
  except
    on EOutOfMemory do
      AddSpark := LNoMemory
    else
      AddSpark := LUndefined;
    if help<>nil then
    begin
      dispose(help); dec(booked)
    end
  end
end;
In welchem Fall kann das denn passieren? Ich sehe da keinen offensichtlichen Fehler...
lg Looper

Luckie 22. Feb 2012 13:49

AW: Variable ist möglicherweise nicht initialisiert worden
 
Wenn es in der ersten Zeile des try-Blocks zu einer Exception kommt springt er in den except-Abschnitt und dann ist help nicht initialisiert.

DanielProgramming 22. Feb 2012 13:51

AW: Variable ist möglicherweise nicht initialisiert worden
 
Falls bei
Delphi-Quellcode:
new(help); inc(booked);
etwas schief geht würde help undefiniert sein.

himitsu 22. Feb 2012 13:52

AW: Variable ist möglicherweise nicht initialisiert worden
 
In Welcher Codezeile kommt denn diese Meldung?

Delphi-Quellcode:
var
  help : PSparkList;
begin
    ...
    pRoot := help;
Var-Parameter und damit auch das New werden nicht so beachtet.
Denn innerhalb der der Prozedur, kann man nicht sicherstellen, daß dort wirklich was zugewiesen wird. (bei Out-Parametern könnte das anders aussehn)
Immerhin kann ja innerhalb der Prozedur auch nur lesend, bzw. erstmal Lesend und dann schreibend auf diese Variable zugegriffen werden.

Für den Compiler fehlt praktisch eine vorherrige Zuweiseung
Delphi-Quellcode:
help := ...;
, vor dem ersten potentiellen Lesezugriff darauf.


Und zu der Aussage von DanielProgramming:
Delphi-Quellcode:
  try
    ...
  except
    ...
    if help<>nil then
Help wurde eventuell niemals initialisiert, wenn etwas passiert.

Looper 22. Feb 2012 14:00

AW: Variable ist möglicherweise nicht initialisiert worden
 
Okay. Aber ist das explizit für meinen Code ein Problem?
Ich will ja nur sicher gehen, dass der reservierte Speicher auf jeden Fall wieder freigegeben wird.

Wenn ich mir jetzt mit new(help) Speicher reserviere ist der Inhalt noch nicht initialisiert, aber ich möchte in einem Fehlerfall ja auch nur wieder den Speicher freigeben. Somit kann ich diese Warnung doch ignorieren oder sehe ich das falsch.

Luckie 22. Feb 2012 14:01

AW: Variable ist möglicherweise nicht initialisiert worden
 
Dann nimm try-finally.

DeddyH 22. Feb 2012 14:05

AW: Variable ist möglicherweise nicht initialisiert worden
 
Das bringt auch nichts, da der Speicher ja nur im Fehlerfalle freigegeben werden soll, oder? Evtl. sollte man vor dem try einfach help auf nil setzen.

Looper 22. Feb 2012 14:09

AW: Variable ist möglicherweise nicht initialisiert worden
 
Zitat:

Zitat von DeddyH (Beitrag 1152357)
Das bringt auch nichts, da der Speicher ja nur im Fehlerfalle freigegeben werden soll, oder? Evtl. sollte man vor dem try einfach help auf nil setzen.

Genau.
Und mit dem Tipp läuft das dann natürlich auch einwandfrei.

Danke

himitsu 22. Feb 2012 14:09

AW: Variable ist möglicherweise nicht initialisiert worden
 
* Result ist irgendwie verständlicher, als soein Funktionsname. (vorallem kann man da auch Lesend drauf zugreifen)
* booked vor dem New setzen, da es bei OutOfMemory nie hinzugezählt würde, aber im Except wir immer abgezogen.
Delphi-Quellcode:
function AddSpark(aData : TSpark) : EList;
var
  help : PSparkList;
begin
  help := nil;
  try
    Inc(booked);
    New(help);
    help^.Data := aData;
    help^.pNext := pRoot;
    pRoot := help;
    Result := LOK;
  except
    on EOutOfMemory do
      Result := LNoMemory
    else
      Result := LUndefined;
    if Assigned(help) then
    begin
      Dec(booked);
      Dispose(help);
    end;
  end;
end;
Aber im Prinzip seh ich hier nur eine Exceptionquelle.
Das Andere sind wohl alles nur "harmlose" Typen/Variablen.
Delphi-Quellcode:
function AddSpark(aData : TSpark) : EList;
var
  help : PSparkList;
begin
  try
    New(help);
    Inc(booked);
    help^.Data := aData;
    help^.pNext := pRoot;
    pRoot := help;
    Result := LOK;
  except
    Result := LNoMemory;
  end;
end;

// oder von mir aus auch so

function AddSpark(aData : TSpark) : EList;
var
  help : PSparkList;
begin
  try
    New(help);
  except
    Exit(LNoMemory); // Result := LNoMemory; Exit;
  end;
  Inc(booked);
  help^.Data := aData;
  help^.pNext := pRoot;
  pRoot := help;
  Result := LOK;
end;
Standardmäßig braucht man bei help^.Data nicht manuell dereferenzieren. (Delphi macht es bei help.Data von alleine)

Looper 22. Feb 2012 14:17

AW: Variable ist möglicherweise nicht initialisiert worden
 
Zitat:

Zitat von himitsu (Beitrag 1152360)
* Result ist irgendwie verständlicher, als soein Funktionsname. (vorallem kann man da auch Lesend drauf zugreifen)

Finde ich auch, aber aus mir nicht ersichtlichen Gründen ist es mir verboten result zu benutzen.. FH-Richtlinie :shock:
Zitat:

Zitat von himitsu (Beitrag 1152360)
* booked vor dem New setzen, da es bei OutOfMemory nie hinzugezählt würde, aber im Except wir immer abgezogen.

Danke für den Tipp. Ändere ich gleich.

EDIT
Zitat:

Zitat von himitsu (Beitrag 1152360)
Standardmäßig braucht man bei help^.Data nicht manuell dereferenzieren. (Delphi macht es bei help.Data von alleine)

Es handelt sich um ein Programmierpraktikum in einer Fachhochschule und Ziele sind unter anderem Verständnis von dynamischen Datenstrukturen zu bekommen und das erstmalige Schreiben eines halbwegs umfangreichen Programmes. Daher zeige ich mal lieber, dass ich weiß: "Es sind Zeiger mit denen ich hantiere :D"


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz