Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi abs funktioniert nicht (https://www.delphipraxis.net/145915-abs-funktioniert-nicht.html)

hansdieter11 10. Jan 2010 20:40


abs funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

habe ein Programm geschrieben, in dem Kugeln Raumschiffe treffen sollen.

Das habe ich dann mit abs(... - ... < 1) gelöst, doch das Programm stürzt sofort ab.

Danke schonmal für die Mithilfe. :)

Grüße
Timo ;)

Delphi-Quellcode:
procedure TForm1.TiRaumschiffTimer(Sender: TObject);
begin
  FOR r:=1 TO number DO
    begin
     IF Raumschiff[r] <> nil
     THEN
      begin
        Raumschiff[r].GoRight;
        ShRaumschiff[r].Left := Raumschiff[r].xCoord;


        IF Raumschiff[r].xCoord > 700
        THEN
         begin
           Raumschiff[r].xCoord := -50;
           ShRaumschiff[r].Left := Raumschiff[r].xCoord;
         end;

        If (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) and
            (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) then
        begin
          Raumschiff[r].Destroy;
          Abgeschossen := Abgeschossen+1;
        end;

      end;
     end;

  LaRaumschiffe.caption := inttostr(Abgeschossen);
end;

omata 10. Jan 2010 20:45

Re: abs funktioniert nicht
 
- Debuggen? -> Welche Zeile?
- Mit Destroy gibt man keine Objekte frei.

himitsu 10. Jan 2010 20:45

Re: abs funktioniert nicht
 
Wie in der OH steht, ruft man Destroy nicht direkt auf, :warn:
sondern nutzt Free.

Wobei, da du auf NIL prüfst, solltest du Delphi-Referenz durchsuchenFreeAndNil verwenden

hansdieter11 10. Jan 2010 20:47

Re: abs funktioniert nicht
 
Ich verstehe leider kein Wort :(
Was muss ich jetzt machen, damit es funktioniert ? :)
Grüße
Timo

omata 10. Jan 2010 20:48

Re: abs funktioniert nicht
 
Delphi-Quellcode:
:
  If (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) and
      (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) then
  begin
    Raumschiff[r].Free;
    Raumschiff[r]:=nil;
    Abgeschossen := Abgeschossen+1;
  end;
:

hansdieter11 10. Jan 2010 20:50

Re: abs funktioniert nicht
 
Verstehe deinen Ansatz, aber es geht immer noch nicht.

Habe mein Programm auch online gestellt, falls du es dir im Ganzen angucken möchtest.

Grüße

omata 10. Jan 2010 20:54

Re: abs funktioniert nicht
 
Schau dir einfach mal die Warnungen an, die dein Compiler dir ausspuckt und beheben diese. Dann läuft dein Programm einwandfrei.

Edit: Globale Variablen sind böse und so wenig wie nötig zu verwenden!

hansdieter11 10. Jan 2010 20:58

Re: abs funktioniert nicht
 
Aber wenn ich i global mache, so wird sie bei abs(....[i]) wohl nicht erkannt, oder ?
Grüße :)

omata 10. Jan 2010 21:03

Re: abs funktioniert nicht
 
Ich verstehe deine Probleme nicht.

Der Compiler sagt, dass die Laufvariable einer FOR-Schleife immer lokal deklariert sein muss.

Also deklariere dein i und r lokal, dort wo deine Schleifen sind und fertig.

Mach es doch nicht kompilzierter als es ist.

hansdieter11 10. Jan 2010 21:05

Re: abs funktioniert nicht
 
Ja, das habe ich doch gemacht, aber nun verschwinden die Raumschiffe
bei Berührung mit der Kugel nicht und 'Abgeschossen' geht auch nicht hoch. :(

omata 10. Jan 2010 21:06

Re: abs funktioniert nicht
 
Ok, jetzt sehe ich was du meinst.

So geht das aber nicht! Dann musst du dein Konzept umstellen. Du kannst nicht in einer Routine eine Schleife haben und in einer anderen auf deren Zählwert zugreifen. So kann man nicht programmieren.

hansdieter11 10. Jan 2010 21:07

Re: abs funktioniert nicht
 
Das ist klar.
Aber wie löse ich das bzw. wo mache ich die ABS-Abfrage rein, sodass alles geht ? :)

omata 10. Jan 2010 21:10

Re: abs funktioniert nicht
 
Dafür muss man erstmal verstehen, was du überhaupt machen willst und das muss ganz anders aufgebaut werden.

Der erste Ansatz wäre erstmal nur einen einzigen Timer für alles zubenutzen.

Dann musst du eben jeweils für jedes Objekt nachschauen, ob es mit einem anderen kollidiert.

hansdieter11 10. Jan 2010 21:23

Re: abs funktioniert nicht
 
Delphi-Quellcode:
procedure TForm1.TiRaumschiffTimer(Sender: TObject);
var r,i: integer;
begin
  FOR r:=1 TO number DO
    begin
     IF Raumschiff[r] <> nil THEN
       begin
         Raumschiff[r].GoRight;
         ShRaumschiff[r].Left := Raumschiff[r].xCoord;

         IF Raumschiff[r].xCoord > 700 THEN
           begin
             Raumschiff[r].xCoord := -50;
             ShRaumschiff[r].Left := Raumschiff[r].xCoord;
           end;
       end;
     end;


  FOR i:=1 TO nummer DO
    begin
      IF Kugel[i] <> nil THEN
        begin
          Kugel[i].GoUp;
          ShKugel[i].Top := Kugel[i].yCoord;
        end;
    end;

   If (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) and
      (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) then
     begin
       Raumschiff[r].Destroy;
       Abgeschossen := Abgeschossen+1;
     end;

  LaRaumschiffe.caption := inttostr(Abgeschossen);
end;
[Warnung] Unit1.pas(153): FOR-Schleifenvariable 'r' kann nach Durchlauf undefiniert sein

[Warnung] Unit1.pas(153): FOR-Schleifenvariable 'i' kann nach Durchlauf undefiniert sein

Funktioniert leider nicht. :(
Oder was ist mein Fehler ?

omata 10. Jan 2010 21:27

Re: abs funktioniert nicht
 
Die Meldung ist doch eindeutig. Du kannst nicht auf eine Laufvariable einer FOR-Schleife außerhalb der Schleife zugreifen.
Also entweder den Wert in einer anderen Variablen abspeichern oder die zweite Schleife innerhalb der ersten notieren? Das kommt darauf an, was man machen will.

Klaus01 10. Jan 2010 21:31

Re: abs funktioniert nicht
 
Guten Abend,

du nutzt die Schleifenvariablen r und i nach der Schleife.
Da können sie einen undefinierten Wert haben.

In Deinem Fall hat r den Wert number
und i den Wert nummer.

Wenn in der Schleife ein Überprüfungskriterium zutrifft
solltest Du den Wert von r bzw. i in einer separaten Variable speichern.

Grüße
Klaus

hansdieter11 10. Jan 2010 21:43

Re: abs funktioniert nicht
 
Es wird nie mehr was glaube ich :D

Delphi-Quellcode:
procedure TForm1.TiRaumschiffTimer(Sender: TObject);
var r,i: integer;
begin
  FOR i:=1 TO nummer DO
  begin
  FOR r:=1 TO number DO
    begin
     IF Raumschiff[r] <> nil THEN
       begin
         Raumschiff[r].GoRight;
         ShRaumschiff[r].Left := Raumschiff[r].xCoord;

         IF Raumschiff[r].xCoord > 700 THEN
           begin
             Raumschiff[r].xCoord := -50;
             ShRaumschiff[r].Left := Raumschiff[r].xCoord;
           end;

         If (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) and
            (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) then
           begin
             Raumschiff[r].Free;
             Raumschiff[r] := nil;
             Abgeschossen := Abgeschossen+1;
           end;
       end;
     end;

     IF Kugel[i] <> nil THEN
       begin
         Kugel[i].GoUp;
         ShKugel[i].Top := Kugel[i].yCoord;
       end;
     end;

  LaRaumschiffe.caption := inttostr(Abgeschossen);
Stürzt wieder sofort ab. Habe jetzt alles so geändert, wie vorgeschlagen.

omata 10. Jan 2010 21:45

Re: abs funktioniert nicht
 
Du prüfst ja auch nicht (überall) ob du überhaupt auf die Kugel zugreifen darfst.

Setzt einen Breakpoint, schau dir an, wo das was du dir überlegt hast nicht mehr mit dem übereinstimmt, was passiert und ändere das, was falsch läuft ab.

So programmiert man.

Klaus01 10. Jan 2010 21:47

Re: abs funktioniert nicht
 
Delphi-Quellcode:
 
FOR i:=1 TO nummer DO
  begin
    FOR r:=1 TO number DO
      begin
        IF Raumschiff[r] <> nil THEN
          begin
            Raumschiff[r].GoRight;
            ShRaumschiff[r].Left := Raumschiff[r].xCoord;

            IF Raumschiff[r].xCoord > 700 THEN
              begin
                Raumschiff[r].xCoord := -50;
                ShRaumschiff[r].Left := Raumschiff[r].xCoord;
              end;

            If (abs(Raumschiff[r].yCoord-Kugel[i].yCoord)<1) and
              (abs(Raumschiff[r].xCoord-Kugel[i].xCoord)<1) then
              begin
                Raumschiff[r].Free; // Raumschiff r wird freigegeben und beim nächsten Durchlauf i+1 kracht es
                Raumschiff[r] := nil;
                Abgeschossen := Abgeschossen+1;
              end;
          end;
    end;
[edit] das ist natürlich Mumpitz, denn Du prüfst ja auf <> nil im Schleifenbegin


Grüße
Klaus

omata 10. Jan 2010 21:53

Re: abs funktioniert nicht
 
Zitat:

Zitat von Klaus01
[edit] das ist natürlich Mumpitz, denn Du prüfst ja auf <> nil im Schleifenbegin

Was soll das jetzt. Hat er denn immer soviele Raumschiffe wie Kugeln?

hansdieter11 10. Jan 2010 21:55

Re: abs funktioniert nicht
 
Ja also jetzt geht nichts mehr.
Gibt es vielleicht eine andere Lösung für abs ?
Grüße

Klaus01 10. Jan 2010 22:05

Re: abs funktioniert nicht
 
@omata
mit Mumpitz meinte ich das, was ich geschrieben hatte.

Grüße
Klaus

hansdieter11 10. Jan 2010 22:11

Re: abs funktioniert nicht
 
habe es jetzt hinbekommen beide sachen in einen timer zu packen, in dem auch bei jeder abfrage jede variable deklariert ist..
mein letztes problem ist somit die kollisionsabfrage:
ich habe es, wie in den vorherigen posts sichtbar, mit abs probiert, allerdings geht das nicht. es passiert einfach nichts..
gibts eine alternativbefehl für eine kollisionsabfrage?

Delphi-Quellcode:
FOR i:= 1 TO nummer DO
  begin
    FOR u:= 1 TO n DO
      begin
        IF Raumschiff[u] <> nil
        THEN
          begin
            Raumschiff[u].GoRight;
            ShRaumschiff[u].Left := Raumschiff[u].xCoord;
            IF Raumschiff[u].xCoord > 700
            THEN
              begin
                Raumschiff[u].xCoord := -50;
                ShRaumschiff[u].Left := Raumschiff[u].xCoord;
              end;
            end;
        IF Kugel[i] <> nil
        THEN
          begin
            Kugel[i].GoUp;
            ShKugel[i].Top := Kugel[i].yCoord;
          end;
        IF (Raumschiff[u] <> nil) AND (Kugel[i] <> nil)
        THEN
         begin
           // kollisionsabfrage
         end;
    end;
end;

omata 10. Jan 2010 22:17

Re: abs funktioniert nicht
 
Baue deine Kollisionsabfrage doch wieder ein.
Das abs entfernt das Vorzeichen, sodass das Ergebnis deiner Subtraktion niemals negativ sein kann.

hansdieter11 10. Jan 2010 22:22

Re: abs funktioniert nicht
 
welches vorzeichen vor abs??
habe doch geschrieben das diese nicht funktioniert.
gibt es jetzt eine alternative zu abs? gibts da nicht irgendwie was mit toleranz oder so?
auf wunsch lade ich auch gerne das aktuelle programm hoch...
vielen dank für jegliche hilfe!

//EDIT:

aaah ich korregiere mich, es klappt doch, entschuldigung :/ der toleranzbereich 1 war einfach zu klein..

hansdieter11 10. Jan 2010 22:29

Re: abs funktioniert nicht
 
Nun ein letztes Problem :/
Die Raumschiffe werden immer schneller.
Ich habe keine Ahnung woran das liegt.

Grüße

Medium 10. Jan 2010 22:30

Re: abs funktioniert nicht
 
Mh, nur so am Rande: Ich glaube du hast eine falsche Vorstellung von dem, was abs() macht. Es steht nicht für Abstand, und ist gewiss keine Funktion speziell für Kollisionsabfragen.

fkerber 10. Jan 2010 22:31

Re: abs funktioniert nicht
 
Hi!

Mach bitte für dein neues Problem auch einen neuen Thread auf - sonst geht es hier drunter und drüber ;)


Grüße, Frederic

hansdieter11 10. Jan 2010 22:33

Re: abs funktioniert nicht
 
Ja, das hängt doch aber mit dem einem Timer zusammen.
Also wäre es echt nett, wenn mir das einer hier schnell beantworten könnte.

Grüße

Medium 10. Jan 2010 22:35

Re: abs funktioniert nicht
 
Threadtitel: "abs funktioniert nicht"

Hat nix mit Timern und schnellen Raumschiffen zu tun.

fkerber 10. Jan 2010 22:35

Re: abs funktioniert nicht
 
Hi!

Soweit ich das hier erkennen kann, geht es hier um Kollisionserkennung und nicht um irgendetwas mit Timern.
Insofern schneidest du jetzt ein ganz neues Thema an - und das führt zu Verwirrung.

Daher:
Mach dafür bitte ein neues Thema auf!

Grüße, Frederic

Sir Rufo 10. Jan 2010 22:36

Re: abs funktioniert nicht
 
Zitat:

Zitat von Medium
Threadtitel: "abs funktioniert nicht"

Hat nix mit Timern und schnellen Raumschiffen zu tun.

doch bei ihm schon :mrgreen:

Medium 10. Jan 2010 22:38

Re: abs funktioniert nicht
 
Manche schaffen echt die unmöglichsten Dinge =)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 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