Announcement

Collapse
No announcement yet.

Delphi Bug ??

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

  • Delphi Bug ??

    Hallo zusammen.

    Ich bin gerade am verzweifeln.
    Folgendes Szenario.

    - Ich nutze Delphi 5 Enterprise Edition mit Update Pack 1
    - Ich habe 2 Units

    In Unit 1 ist ein Array wie folgt deklariert

    <PRE>

    RgnPunkteHU : Array [0..4] of TPoint = ((x: 35;y: 35),(x: 60;y: 35),(x: 60;y: 60),(x: 35;y: 60),(x: 35;y: 35));
    </PRE>

    In Unit 2 mache ich folgende Abfrage

    <PRE>

    for Lauf_Region := 0 to length(RgnPunkteHU) - 1 do begin
    if ((x = RgnPunkteHU[Lauf_Region].x) and (y = RgnPunkteHU [Lauf_Region].Y)) then begin
    RgnPunkteHU[Lauf_Region].x := XNeu; // HIER IST DER HALTEPUNKT
    RgnPunkteHU[Lauf_Region].y := YNeu;
    end;
    end;

    </PRE>

    Lauf_Region ist von Typ Integer;
    x, y sind auch integer und laufen in einer Schleife.

    Jetzt passiert beim debuggen folgendes.
    Den Haltepunkt setze ich nach der If Anweisung.
    Wenn ich am Haltepunkt bin, haben die Variablen folgende Werte:

    x = 60 <BR>
    Y = 60 <BR>
    RgnPunkteHU[Lauf_Region].x = 35 <BR>
    RgnPunkteHU[Lauf_Region].y = 60 <BR>
    (x = RgnPunkteHU[Lauf_Region].x) = false <BR>
    (y = RgnPunkteHU[Lauf_Region].Y) = true <BR>
    ((x = RgnPunkteHU[Lauf_Region].x) and (y = RgnPunkteHU[Lauf_Region].Y)) = false <P>

    Warum komme ich trotzdem an den Haltepunkt ?? Die Bedingung in der If Anweisung gibt doch FALSE zurück !! Ist das ein Delphi Bug ?? Ich bin echt am verzweifeln !!!!
    Ich hoffe ihr versteht was ich meine.

  • #2
    Überprüfe mal den Wert von Lauf_Region. Delphi verwirft Variable, wenn nicht mehr erforderlich, dass kann in Deinem Fall passiert sein. Dann würdest Du mit Zufallswerten debuggen...<p>
    Schöne Grüße, Mario Noack<p>
    PS: Und unbedingt Optimierung ausschalten, sonst laufen Schleifen auch manchmal anders, wie erwartet, wenn das Ergebnis identisch ist
    Schöne Grüße, Mario

    Comment


    • #3
      Interessant:<BR>
      Sieht ganz so aus, als würde Delphi Deine Werte .x und .Y nicht sauber zurückgeben.
      Unter D4 kann ich das ebenfalls nachvollziehen.<BR>
      <BR>
      Wenn man Deine Punkte in Variablen schreibt (z und w) <BR>
      <PRE>
      for Lauf_Region := 0 to length(RgnPunkteHU) - 1 do
      begin
      z:=RgnPunkteHU[Lauf_Region].x;
      w:=RgnPunkteHU [Lauf_Region].Y;
      if ((x = z) and (y = w))=true then
      begin
      RgnPunkteHU[Lauf_Region].x := XNeu; // HIER IST DER HALTEPUNKT
      RgnPunkteHU[Lauf_Region].y := YNeu;
      end;
      end;
      </PRE>
      <BR>
      funktionierts komischer Weise.<BR>
      Da hält er nicht an der "falschen" Stelle.
      <BR>
      Das "=true" im if-Zweig, war nur, wegens der Zweifel...
      <BR>
      <BR>
      Andrea

      Comment


      • #4
        Dann ist das Problem klar der Optimierung des Compilers zuzuschreiben. Das stört zwar beim Debuggen, aber da kann mans ja ausschalten. Am Endergebnis darf sich nichts ändern.<p>
        Schöne Grüße, Mario Noack<p&gt
        Schöne Grüße, Mario

        Comment


        • #5
          Hi,<BR>
          mit diesem Codebeispiel war es aber im Test egal, ob ich die Optimierung abgeschaltet hatte oder nicht. Es war beidesmale das gleiche, positive, Ergebnis. <BR>
          Er hält richtig an. Aber wenn die Optimierung zugeschaltet ist, dann zeigt er den Inhalt von w und z nicht an. Klar. <BR>
          Also muss bei Michaels Code Delphi noch ein anderes Problem haben. Es zeigt meiner Meinung nach schlichtweg die falschen Werte an.
          <BR>
          Andrea

          Comment


          • #6
            Kannst Du das Beispiel mal probieren:<p>
            <pre>unit Unit1;

            interface

            uses
            Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
            Dialogs;

            type
            TForm1 = class(TForm)
            procedure FormCreate(Sender: TObject);
            private
            public
            end;

            var
            Form1: TForm1;
            RgnPunkteHU : Array [0..4] of TPoint = ((x: 35;y: 35),(x: 60;y: 35),(x: 60;y: 60),(x: 35;y: 60),(x: 35;y: 35));

            implementation

            {$R *.dfm}

            procedure TForm1.FormCreate(Sender: TObject);
            var Lauf_Region,x,y,xneu,yneu: Integer;
            begin
            x := 60;
            Y := 60;
            xneu := 60;
            Yneu := 60;
            for Lauf_Region := 0 to length(RgnPunkteHU) - 1 do begin
            if ((x = RgnPunkteHU[Lauf_Region].x) and (y = RgnPunkteHU [Lauf_Region].Y))
            then begin
            RgnPunkteHU[Lauf_Region].x := XNeu; // HIER IST DER HALTEPUNKT RgnPunkteHU[Lauf_Region].y := YNeu; end; end;
            RgnPunkteHU[Lauf_Region].y := YNeu;
            end;
            end;
            end;

            end.
            </pre><p>
            Es tut bei mir (D7) ohne Probleme, bei Dir auch?<p>
            Schöne Grüße, Mario Noac
            Schöne Grüße, Mario

            Comment


            • #7
              Hallo.

              Danke für eure Hilfe.
              Es lag an der Optimierung. Wenn ich die Optimierung ausschalte, funktioniert es wunderbar

              Comment


              • #8
                Achso, in dem Zusammenhang ist vielleicht ein Fakt erwähnenswert:<br>
                Ändert sich ein Delphi-Compiler Parameter, muss das Projekt neu erzeugt werden, sonst wird unter Umständen die neue Option erst nach Änderung der Unit in deren Kompilat übernommen.<p>
                Schöne Grüße, Mario Noac
                Schöne Grüße, Mario

                Comment


                • #9
                  Hi Mario.

                  Danke für den Tip. Ich hab mir eh angewöhnt bei irgendeiner Änderung im Projekt komplett neu zu erzeugen. Ich hätte aber noch eine Frage.

                  RgnPunkteHU ist ein Array of TPoint. Mit diesen Punkten erzeuge ich eine Region auf einem Canvas. Das Canvas wird gedreht. Jetzt will ich die Region mitdrehen, aber weis nicht wie. Wie kann ich die neuen X/Y Koordinaten der einzelnen Punkte errechen ?
                  Ich hab den Winkel in Grad.

                  Wer kann mir helfen ?

                  Gruß
                  Mich

                  Comment


                  • #10
                    Ich ;-)<p>
                    <pre> // Für die Darstellung von gedrehten Rechtecken
                    t_RectList = array[1..4] of TPoint;

                    // Gibt in Form einer TPoint-List ein gedrehtes Rechteck zurück
                    // Winkel im Bogenmass
                    function RotateRect(const Rect: TRect; const Center: TPoint; const Angle: Double): t_RectList;
                    var
                    DX, DY: Integer;
                    SinAng, CosAng: Extended;
                    function RotPoint(PX, PY: Integer): TPoint;
                    begin
                    DX := PX - Center.x;
                    DY := PY - Center.y;
                    Result.x := Center.x + Round(DX * CosAng - DY * SinAng);
                    Result.y := Center.y + Round(DX * SinAng + DY * CosAng);
                    end;
                    begin
                    SinCos(Angle * (Pi / 180), SinAng, CosAng);
                    Result[1] := RotPoint(Rect.Left, Rect.Top);
                    Result[2] := RotPoint(Rect.Right, Rect.Top);
                    Result[3] := RotPoint(Rect.Right, Rect.Bottom);
                    Result[4] := RotPoint(Rect.Left, Rect.Bottom);
                    end; // RotateRect
                    </pre><p>
                    Schöne Grüße, Mario Noac
                    Schöne Grüße, Mario

                    Comment


                    • #11
                      Hi.

                      Das sieht ja nicht schlecht aus.
                      Vielen Dank. Werds mal testen.

                      Gruß
                      Mich

                      Comment


                      • #12
                        Kannst du mir vielleicht auch noch sagen, wie ich ein Dreieck drehe ?? ;-)

                        Irgendwie funktioniert dein Code nur mit Rechtecken.

                        Gruß
                        Mich

                        Comment


                        • #13
                          Nicht getestet:<p>
                          <pre>// Für die Darstellung von gedrehten Rechtecken
                          t_TriangleList = array[1..3] of TPoint;

                          // Gibt in Form einer TPoint-List ein gedrehtes Rechteck zurück
                          // Winkel im Bogenmass
                          function RotateTriangle(const Triangle: t_TriangleList; const Center: TPoint; const Angle: Double): t_TriangleList;
                          var
                          DX, DY: Integer;
                          SinAng, CosAng: Extended;
                          function RotPoint(PX, PY: Integer): TPoint;
                          begin
                          DX := PX - Center.x;
                          DY := PY - Center.y;
                          Result.x := Center.x + Round(DX * CosAng - DY * SinAng);
                          Result.y := Center.y + Round(DX * SinAng + DY * CosAng);
                          end;
                          begin
                          SinCos(Angle * (Pi / 180), SinAng, CosAng);
                          Result[1] := RotPoint(Triangle[1].x, Triangle[1].y);
                          Result[2] := RotPoint(Triangle[2].x, Triangle[2].y);
                          Result[3] := RotPoint(Triangle[3].x, Triangle[3].y);
                          end; // RotateTriangle
                          </pre><p>
                          Grüße, Mari
                          Schöne Grüße, Mario

                          Comment


                          • #14
                            Vielen Dank.
                            Werds mal testen.

                            Gruß Mich

                            Comment

                            Working...
                            X