Announcement

Collapse
No announcement yet.

"Auf ... zugewiesener Wert wird niemals benutzt"

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • "Auf ... zugewiesener Wert wird niemals benutzt"

    Hallo!<br>
    <br>
    Gelegentlich tritt das Phänomen (?) auf, dass eine Variablen-Zuweisung vom Compiler ignoriert wird. Als<br>
    Hinweis erscheint "Auf ... zugewiesener Wert wird niemals benutzt", was dann noch nicht mal stimmt.<br>
    Beispiel: <br>
    procedure sowieso;<br>
    var I : Integer;<br>
    begin<br>
    I := 0; // Diese Anweisung wird vom Compiler schon übergangen<br>
    // Weitere Anweisungen<br>
    if (irgendeine Bedingung) then I := 1 // Diese Bedingung wurde total übersprungen.<br>
    else I := 0;<br>
    if I = 0 then begin<br>
    ShowMessage('Fehler');<br>
    Exit;<br>
    else <br>
    (Weitermachen);<br>
    end;<br>

    Da ich solchen Code zur Programmsteuerung einsetzen will, ist diese Eigenheit schon ärgerlich.<br>
    Woher rührt dieser Hinweis? Er tritt häufig mit Boolean-Variablen auf, hat aber bisher offensichtlich<br>
    noch keinen Schaden angerichtet. Ich arbeite mit Delphi 5 unter Win95, Compilereinstellungen sind <br>
    die Defaulteinstellungen der Installation.<br>
    Für Hinweise zur Abhilfe wäre ich dankbar.<br>
    <br>
    Heidrun Terasa<br>

  • #2
    Hallo,

    keine Sorge, es ist alles in Ordnung. Hier ein Auszug aus der Delphi Hilfe (Compilermeldung anklicken und F1 drücken):

    <pre>
    Der Compiler gibt diese Hinweismeldung aus, wenn der einer Variablen zugewiesene Wert nicht benutzt wird. Wenn die Optimierung aktiviert ist, wird die Zuweisung gelöscht.

    Dies kann vorkommen, wenn die Variable nicht mehr benutzt wird und wenn ihr vor der Verwendung ein neuer Wert zugewiesen wird.

    program Produce;
    {$HINTS ON}

    procedure Simple;
    var
    I: Integer;
    begin
    I := 42; {*<-- Hier die Hinweismeldung*}
    end;

    procedure Propagate;
    var
    I: Integer;
    K: Integer;
    begin
    I := 0; {*<-- Hier die Hinweismeldung*}
    Inc(I); {*<-- Hier die Hinweismeldung*}
    K := 42;
    while K > 0 do begin
    if Odd(K) then

    Inc(I); {*<-- Hier die Hinweismeldung*}
    Dec(K);
    end;
    end;

    procedure TryFinally;
    var
    I: Integer;
    begin
    I := 0; {*<-- Hier die Hinweismeldung*}
    try
    I := 42;
    finally
    Writeln('Endlich angekommen');
    end;
    Writeln(I); {*Schreibt immer 42 - wenn eine Ausnahme auftreten würde,
    kämen wir gar nicht hier an*}
    end;

    begin
    end.

    In der Prozedur Propagate ist der Compiler schlau genug, um zu erkennen, daß die Variable I nicht innerhalb der while-Schleife inkrementiert werden muß, weil I danach gar nicht mehr benutzt wird, und daß daher die Inkrementierung und die Zuweisung vor der while-Schleife ebenfalls überflüssig sind.

    In der Prozedur TryFinally ist die Zuweisung zu I vor der try-finally-Struktur nicht notwendig. Wenn eine Ausnahme auftritt, wird die Writeln-Anweisung am Ende nicht ausgeführt, so daß der Wert von I keine Rolle spielt. Tritt keine Ausnahme auf, ist der Wert von I für die Writeln-Anweisung immer gleich 42. Daher wird die erste Zuweisung das Verhalten der Prozedur nicht verändern und kann also gelöscht werden.

    Mit dieser Hinweismeldung wird nicht angedeutet, daß Ihr Programm fehlerhaft ist - sie bedeutet einfach, daß der Compiler festgestellt hat, daß es eine Zuweisung gibt, die nicht notwendig ist.

    In der Regel können Sie diese Zuweisung einfach löschen - sie wird im compilierten Programmcode ohnehin fallengelassen, wenn Sie die Compilierung bei aktivierter Optimierung durchführen.

    In manchen Fällen liegt das wirkliche Problem allerdings darin, daß Sie eine Zuweisung zur falschen Variable durchgeführt haben, also beispielsweise eine Zuweisung zu J durchführen wollten, aber tatsächlich eine Zuweisung zu I vorgenommen haben. Es ist also die Mühe wert, die fragliche Zuweisung sorgfältig zu überprüfen.
    </pre&gt

    Comment


    • #3
      Danke schön, <br>
      <br>
      das Thema ist mir klarer geworden. Allerdings habe ich der Variablen i je nach<br>
      Bedingung verschiedene Werte zugewiesen und ihren Wert später auch abgefragt. <br>
      (if i ... then ...). Zählt das für den Compiler nicht als "benutzen"? Muss sie dazu <br>
      als Index oder Zählvariable auftauchen? Und noch eine Frage: Ich könnte auch die <br>
      Optimierung in den Compileroptionen ausschalten. Hat das Auswirkungen auf <br>
      das gesamte Programm oder nur auf die Compilierung selbst?<br>
      <br>
      Heidrun Terasa<br&gt

      Comment


      • #4
        Hallo Heidrun,

        da ich mich um diese Dinge nie gekümmert habe (solange kein Fehler aufgetreten ist), möchte ich deine Frage an A. Kosch (oder andere Experten) weiterreichen: ich hoffe, er liest mit ;-

        Comment


        • #5
          Hallo,

          die Optimierung ist eine "Alles-oder-Nichts-Entscheidung", so gilt dies zum Beispiel auch für die Übergabe der ersten 4 Parameter über die Prozessor-Register (und nicht über den Stack, wie bei deaktivierter Optimierung). Das eigene Programm läuft nach dem Compilieren mit abgeschalteter Optimierung zum einen langsamer und vermutlich instabiler (da Borland alle Tests nur mit aktivierter Optimierung fährt, so dass man mit unerwünschten Seiteneffekten innerhalb der VCL etc. rechnen sollte).

          Wie sieht die konkrete Implementierung (vollständiges Beispiel) aus

          Comment


          • #6
            Ist das mit den fehlenden Zeilenumbrüchen neu? Ich muss im IE 10m nach rechts scrollen, um eine Zeile zu Ende zu lesen

            Comment


            • #7
              Moin,<br>
              <br>
              das originale Beispiel kann ich leider nicht mehr zeigen, da ich die Sache bereits etwas <br>
              anders gelöst habe und der Originalcode überschrieben ist. (Nicht, daß ich nicht meinen <br>
              Code hier zeigen wollte!) Allerdings habe ich festgestellt, daß ich einen logischen <br>
              Fehler ins Programm eingebaut hatte. Ich denke, in Zukunft werde ich mehr auf die <br>
              Optimierungshinweise achten!<br>
              <br>
              Danke schön und frohe Weihnachten,<br>
              <br>
              Heidrun<br&gt

              Comment


              • #8
                Hallo,

                Der Compiler hat durchaus recht, wenn er an deinem Beispiel 'bemängelt', dass der auf i zugewiesene Wert nie benutzt wird. In deinem darauf folgenden if/else Konstrukt, überschreibst du i nämlich auf <b>jeden Fall</b> mit einem neuen Wert. Und damit ist deine vorherige Zuweisung sinnlos ( bzw. kommt nie zum Tragen ).

                Gruß
                Gesin

                Comment

                Working...
                X