Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Multiplikation (https://www.delphipraxis.net/176104-problem-mit-multiplikation.html)

Angel4585 13. Aug 2013 09:20

AW: Problem mit Multiplikation
 
OK, danke für die Aufklärung :D ich mach viel zu wenig Delphi in letzter Zeit :(

Nächste Frage: kommt das Programm in die onColission?
Aufrufe sind zwar da, aber falls die if's nie true sind wird's halt nix.
Gerade die letzte Bedingung (Ball.Coords.Y=Self.fCoords.Y) könnte durchaus problematisch sein.

BUG 13. Aug 2013 10:36

AW: Problem mit Multiplikation
 
OT:
Zitat:

Zitat von NamenLozer (Beitrag 1224560)
Und wie oft vergisst man auf der anderen Seite einfach ein break und hat einen schwer zu findenden Bug?

So gut wie nie. Mit etwas Erfahrung in diesen Sprachen mit diesen Sprachen reicht ein einfaches Überfliegen des Codes, um den Fehler zu finden; zumal man in den meisten Fällen eh case vermeiden sollte.
Aber zurück zum Thema :mrgreen:

Namenloser 13. Aug 2013 11:33

AW: Problem mit Multiplikation
 
OT:
Zitat:

Zitat von BUG (Beitrag 1224572)
Zitat:

Zitat von NamenLozer (Beitrag 1224560)
Und wie oft vergisst man auf der anderen Seite einfach ein break und hat einen schwer zu findenden Bug?

So gut wie nie.

Ich meine das relativ zum anderen Fall.

Pfusch 13. Aug 2013 14:29

AW: Problem mit Multiplikation
 
Vielen Dank für die vielen Ratschläge aber leider besteht das Problem weiterhin.

Die Bedingung für OnCollision stimmt auf jeden Fall und er kommt auch bis zum Case.

Delphi-Quellcode:
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
       case Edge of
           1: Ball.YSpeed := Ball.YSpeed * (-1);
           2: Ball.YSpeed := Ball.YSpeed * (-1);
           3: Ball.XSpeed := Ball.XSpeed * (-1);
           4: Ball.XSpeed := Ball.XSpeed * (-1);
       end;
  end;
wenn ich zb. Ball.YSpeed := 1; setze funktioniert es einwandfrei und es erreicht den Effekt den ich eigentlich mit *(-1) erreichen wollte.

Delphi-Quellcode:
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
       case Edge of
           1: Ball.YSpeed := 1;
           2: Ball.YSpeed := Ball.YSpeed * (-1);
           3: Ball.XSpeed := Ball.XSpeed * (-1);
           4: Ball.XSpeed := Ball.XSpeed * (-1);
       end;
  end;
Und Ball.YSpeed ist in diesem fall auch 100% -1 weil folgendes auch funktioniert:

Delphi-Quellcode:
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
       if Ball.YSpeed = -1 then Ball.YSpeed := 1;
  end;

Pfusch 13. Aug 2013 14:47

AW: Problem mit Multiplikation
 
Ok konnte das Problem jetzt eingrenzen:

Delphi-Quellcode:
procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
  if Ball.YSpeed = -1 then
  begin
       Ball.YSpeed := Ball.YSpeed * (-1);
  end;
  end;
ergibt das Ball.YSpeed = 1 ist.

Delphi-Quellcode:
  if Ball.YSpeed = -1 then
  begin
       Ball.YSpeed := Ball.YSpeed + 2;
  end;
ergibt das Ball.YSpeed = 1 ist.

Delphi-Quellcode:
  procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
  if Edge = 1 then
  begin
       Ball.YSpeed := Ball.YSpeed * (-1);
  end;
  end;
ergibt das Ball.YSpeed = -1 bleibt

Delphi-Quellcode:
  procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
  begin
  if Edge = 1 then
  begin
       Ball.YSpeed := Ball.YSpeed + 2;
  end;
  end;
ergibt das Ball.YSpeed = 3 ist. Anscheinend wird onCollision 2mal hintereinander aufgerufen. Warum das so ist muss ich aber noch herausfinden

Medium 13. Aug 2013 15:35

AW: Problem mit Multiplikation
 
Ich vermute gaaaaaaaaanz stark, dass es in dem Scope der Methode noch ein "Edge" gibt, dass höhere Priorität als der Parameter hat. Weil es geht immer nur dann gut, wenn du "Edge" gerade eben nicht als Bedingung benutzt. Benenne den Parameter doch mal spaßeshalbar um, z.B. nach "aEdge", das wäre sogar noch styleguidekonform :)
Edit: Oder ggf. auch "Ball" mal nach "aBall" umbenennen, auch hier könnte ein ähnliches Problem sein. Hast du z.B. globale Variablen mit diesen Namen?

Helmi 13. Aug 2013 15:48

AW: Problem mit Multiplikation
 
Hallo,

so wie ich das sehe, ist das Problem hier:
Delphi-Quellcode:
  procedure TBrick.onCollision(Edge : Integer; Ball : TBall);
.
Wenn "Ball" geändert werden soll, dann muss es lauten:
Delphi-Quellcode:
  procedure TBrick.onCollision(Edge : Integer;var Ball : TBall);
.

Ansonsten wird Ball nicht verändert (ohne var kein "call by reference").

Hier mal ein Beispiel:
Delphi-Quellcode:
procedure var_minus(var i: Integer);
begin
  i := i * -1;
end;

procedure minus(i: Integer);
begin
  i := i * -1;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  i: Integer;
  j: Integer;

begin
  i := 1;
  j := 1;

  minus(i);
  var_minus(j);

  Label1.Caption := Format('i: %d, j: %d', [i, j]);
end;
Ergibt:
Code:
i: 1, j: -1

Blup 13. Aug 2013 15:58

AW: Problem mit Multiplikation
 
Objekte werden immer als Referenz übergeben, deshalb ist "var" hier überflüssig.

Helmi 13. Aug 2013 16:28

AW: Problem mit Multiplikation
 
Zitat:

Zitat von Blup (Beitrag 1224638)
Objekte werden immer als Referenz übergeben, deshalb ist "var" hier überflüssig.

Ok - hast recht!

vagtler 13. Aug 2013 16:32

AW: Problem mit Multiplikation
 
Zitat:

Zitat von Medium (Beitrag 1224636)
Ich vermute gaaaaaaaaanz stark, dass es in dem Scope der Methode noch ein "Edge" gibt, dass höhere Priorität als der Parameter hat. [...]

Da halte ich dagegen, aber sowas von. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 Uhr.
Seite 3 von 4     123 4      

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