Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Gleitkommadivision durch Null (https://www.delphipraxis.net/171543-gleitkommadivision-durch-null.html)

DelphiUser1 11. Nov 2012 23:43

Gleitkommadivision durch Null
 
ich habe bislang meine Bilddateien ganz gerne als Icon geladen, wollte jetzt aber mal mit Transparenz arbeiten. Dazu verwende ich eine bitmap. Zur animation eines Schußes, verwende ich ein case ereignis und lasse die phasen durchlaufen:
[DELPHI]1: begin
Image7.Picture.Bitmap.LoadFromFile(path+'gun2.bmp' );
Phase:=2;
end;
2:begin
Image7.Picture.Bitmap.LoadFromFile(path+'gun1.bmp' );
Phase:=1;[DELPHI]

Path ist ein String und wird beim fromcreate intialisiert //Path:=ExtractFilePath(ParamStr(0))
Jetzt bekomme ich aber die Fehlermeldung, es gäbe eine Gleitkommadivision.
Weiß jemand hier Rat?

Medium 12. Nov 2012 00:02

AW: Gleitkommadivision durch Null
 
Kann nicht in dem gezeigten Code liegen. Was ist ein "case Ereignis"? Tipp: Das Bild immer wieder neu von der Festplatte zu laden ist herzzerreißend ineffizient. Lade dir die beiden Bilder zu Programmstart in 2 Bitmaps, und weise diese dann dem Image jeweils zu.

DelphiUser1 12. Nov 2012 00:36

AW: Gleitkommadivision durch Null
 
Liste der Anhänge anzeigen (Anzahl: 1)
Woran liegt es dann?
Kann es an der Bitmap liegen?
Weil path ist schon korrekt und die loadfromfile aussage doch auch?
danke für den tipp mit dem laden am programmstart.
Vielleicht ist auch die Bilddatei mal ganz interessant, ich hänge sie einfach mal an, falls es daran liegt.(Delphipraxis wird das Format automatisch in eine jpg ändern)
p.s: http://www.delphibasics.co.uk/RTL.asp?Name=Case

stahli 12. Nov 2012 00:42

AW: Gleitkommadivision durch Null
 
An dem Bitmap liegt es bestimmt nicht.
Hast Du mal einen Haltepunkt gesetzt und den Quelltext schrittweise durchlaufen?

Medium 12. Nov 2012 01:11

AW: Gleitkommadivision durch Null
 
Zitat:

Zitat von DelphiUser1 (Beitrag 1190791)
Woran liegt es dann?

An irgend etwas anderem ;). Debuggen ist da genau das richtige Werkzeug, um die schuldige Stelle ausfindig zu machen. Irgendwo in der DP hier findet sich sogar ein gutes Tutorial zum Thema.

Da wird das "case statement" (case Anweisung) beschrieben. Ich wollte grad eben darauf hinaus, dass das Wort "Ereignis" falsch ist. Das ist insbesondere wichtig, da "Ereignis" im selben Kontext (Delphi) bereits mit einer anderen (treffenderen) wichtigen Bedeutung belegt ist. (Zudem ist es wirklich kein Ereignis.) Wenn man sich nicht ganz über einen Fachbegriff im Klaren ist, ist es keine Schande diesen auszulassen bzw. zu umschreiben, oder besser gar in einer Nebenfrage um eine Klärung zu bitten. Alles andere führt bestenfalls zu Verwirrung und Missverständnissen, was in niemandes Interesse liegen dürfte :)

Hier war es recht eindeutig, aber da du auch in deinem Geschwindigkeits-Thread gehäuft Begriffe im falschen Zusammenhang benutzt hast, vermute ich, dass du noch in der frühen Lernphase bist. Das ist ja auch keine Schande, im Gegenteil. Sich präzise auszudrücken ist in der Informatik (und auch Mathematik) allerdings verflucht wichtig, weswegen es sich lohnen dürfte hier auch ein wenig Energie hineinzustecken. Selbsbewusst mit Fachwörten an den falschen Stellen um sich zu werfen ist in jedem Falle eine schlechte Idee: Die, die es auch nicht besser wissen werden verwirrt, und die "Cracks" denken sich wohlmöglich "argh, Wichtigtuer mit 0 Plan". Daher: Nimm dir lieber etwas mehr Zeit deine Anliegen mit mehr Worten zu beschreiben, die du dafür aber gesichert definiert hast. Anders als an vielen anderen Stellen "im Netz" hören hier die wenigsten nach 5 Zeilen auf zu lesen :dp:

Popov 12. Nov 2012 09:30

AW: Gleitkommadivision durch Null
 
@DelphiUser1

Delphi-Quellcode:
1: begin
...
Geh mit dem Cursor in diese Zeile und drücke F5. Du setzt damit einen Haltemunkt. Noch mal drücken un der ist wieder weg.

Starte das Programm normal (meinetwegen mit F9)

Kommt die Fehlermeldung bevor das Programm den Haltepunkt erreicht, liegt der Fehler wo anders. Wenn nicht, bleibt das Programm an der Stelle stehen.

Jetzt kannst du mit F7 eine einzelne Zeile ausführen (bzw. Anweisung)

Jetzt so lange drücken bis die Zeile mit dem Fehler kommt.

nuclearping 12. Nov 2012 13:31

AW: Gleitkommadivision durch Null
 
Zitat:

Zitat von Popov (Beitrag 1190811)
Jetzt kannst du mit F7 eine einzelne Zeile ausführen (bzw. Anweisung)

F7 steppt aber IN die Anweisung. Mit F8 steppst du 'ne ganze Zeile. :stupid:

Popov 12. Nov 2012 13:46

AW: Gleitkommadivision durch Null
 
Das war schon beabsichtigt. F7 geht eine einzelne Anweisung durch (steht auch da), F8 geht eine Routine durch. Und wenn der Fehler in einer Funktion ist, dann kriegt er bei F8 die Meldung vom Aufruf und ist auch nicht schlauer.

nuclearping 12. Nov 2012 14:51

AW: Gleitkommadivision durch Null
 
Ja, aber lass ihn mal durch Image7.Picture.Bitmap.LoadFromFile(path+'gun2.bmp' ) mit F7 durchsteppen ... Am Ende landet er in irgendwelchen VCL-Units und weiß garnicht mehr weiter. :mrgreen:

p80286 12. Nov 2012 15:00

AW: Gleitkommadivision durch Null
 
Zitat:

Zitat von nuclearping (Beitrag 1190857)
Ja, aber lass ihn mal durch Image7.Picture.Bitmap.LoadFromFile(path+'gun2.bmp' ) mit F7 durchsteppen ... Am Ende landet er in irgendwelchen VCL-Units und weiß garnicht mehr weiter. :mrgreen:

[F7],[F7],[F7],[F7]...[F7],[F7] bis es kracht.
Solange er nicht im CPU-Fenster landet, geht das alles noch.
Hat doch keiner behauptet Debugging wäre ein Kindergeburtstag.

Gruß
K-H

himitsu 12. Nov 2012 15:39

AW: Gleitkommadivision durch Null
 
Zitat:

Zitat von nuclearping (Beitrag 1190857)
Ja, aber lass ihn mal durch Image7.Picture.Bitmap.LoadFromFile(path+'gun2.bmp' ) mit F7 durchsteppen ... Am Ende landet er in irgendwelchen VCL-Units und weiß garnicht mehr weiter. :mrgreen:

Man sollte natürlich nicht mit Debug-DCUs (die der RTL/VCL) debuggen ... leider sind die seit XE3 Standardmäßig an und man kann auch keine Default-Projekteinstellungen mehr speichern.

Und alle glücklichen Besitzer einer Starter/Explorer/Personal/Standard haben dieses Problem sowieso nicht.

DelphiUser1 16. Nov 2012 17:33

AW: Gleitkommadivision durch Null
 
Okay also ich habe jetzt mal die Bilder als Bitmap laden lassen und es kann nur an dem Ladeprozess liegen, der Fehler wird im Debugging hier ganz klar an dieser Stelle angezeigt.
Delphi-Quellcode:
 path:=ExtractFilePath(ParamStr(0));
  PFeuer:=TPistol.Create(self);
  PNormal:=TPistol.Create(self);
  PFeuer.Picture.Bitmap.LoadFromFile(path+'gun1.bmp');
Mir ist aber immer noch nicht klar, worin der Fehler liegt..

stahli 16. Nov 2012 17:42

AW: Gleitkommadivision durch Null
 
Setze mal einen Haltepunkt in der ersten Zeile.
Dann mit F7 weiter.
Wenn Du F7 in der LoadFromFile-Zeile durchführst kommt der Fehler?
Kann/Sollte eigentlich nicht sein!

Welches Delphi hast Du?
Hast Du ein anderes Bild versucht?

Wie sieht die Fehlermeldung genau aus - Screenshot?

Sir Rufo 16. Nov 2012 17:43

AW: Gleitkommadivision durch Null
 
Zitat:

Zitat von DelphiUser1 (Beitrag 1191579)
Okay also ich habe jetzt mal die Bilder als Bitmap laden lassen und es kann nur an dem Ladeprozess liegen, der Fehler wird im Debugging hier ganz klar an dieser Stelle angezeigt.
Delphi-Quellcode:
 path:=ExtractFilePath(ParamStr(0));
  PFeuer:=TPistol.Create(self);
  PNormal:=TPistol.Create(self);
  PFeuer.Picture.Bitmap.LoadFromFile(path+'gun1.bmp');
Mir ist aber immer noch nicht klar, worin der Fehler liegt..

Ganz einfach,
Delphi-Quellcode:
PFeuer.Picture.Bitmap
gibt es noch nicht, dass wird (intern von TPicture wenn benötigt) beim Laden des Bildes erzeugt.

Ändern auf
Delphi-Quellcode:
PFeuer.Picture.LoadFromFile(path+'gun1.bmp');
(Hoffentlich hast du Picture in der Klasse TPistol auch erzeugt)

DeddyH 16. Nov 2012 17:47

AW: Gleitkommadivision durch Null
 
Da würde ich aber eher EAccessViolation statt EDivByZero erwarten, oder? Allerdings wurde die genaue Fehlermeldung sowie die verursachende Zeile noch nicht genannt (oder ich habe es überlesen).

DelphiUser1 16. Nov 2012 17:57

AW: Gleitkommadivision durch Null
 
@stahli: Haltepunkt setzten bringt mich nicht sonderlich weiter, der fehler ist immer der Selbe. Ich benutze die Delphi 7 Testversion..

@DeddyH: Nein es ist EDivByZero und die Zeile ist oben angegeben, das Ganze findet im FormCreate statt

@Sir Rufo: Das hat leider genau den selben Effekt :?

DeddyH 16. Nov 2012 17:59

AW: Gleitkommadivision durch Null
 
Was ist denn TPistol? Bei dem bisschen gezeigten Code ist das das reinste Rätselraten hier, wie soll man da helfen?

DelphiUser1 16. Nov 2012 18:03

AW: Gleitkommadivision durch Null
 
TPistol ist natürlich TImage. Als TPicture habe ich es auch schon probiert, aber das problem muss wohl wo anders liegen, denn ohne TPistol gab es ja genau den selben Fehler

DeddyH 16. Nov 2012 18:05

AW: Gleitkommadivision durch Null
 
Ohne Code kann man nicht helfen, sry.

stahli 16. Nov 2012 18:05

AW: Gleitkommadivision durch Null
 
Pack Dein Projekt mal in eine Zip und hänge es hier an...

DelphiUser1 16. Nov 2012 18:12

AW: Gleitkommadivision durch Null
 
hier findet ihr die Zip Datei:
http://www.delphipraxis.net/171532-g...ml#post1191600

Sir Rufo 16. Nov 2012 18:19

AW: Gleitkommadivision durch Null
 
Hast du es schonmal mit (in Unit1)
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  path := ExtractFilePath( ParamStr( 0 ) );

  PFeuer := TPistol.Create( Self ); // neu
  PNormal := TPistol.Create( Self ); // neu

  PFeuer.Picture.LoadFromFile( path + 'gun1.bmp' ); // Änderung
  PNormal.Picture.LoadFromFile( path + 'gun2.bmp' ); // Änderung

  Image7.Picture.Bitmap.PixelFormat := pf24Bit;
  Start:=50;
  Phase:=1;
  a := 0;
  Punkte:=0;
  randomize;
  doublebuffered := true;
end;
probiert?

DelphiUser1 16. Nov 2012 18:38

AW: Gleitkommadivision durch Null
 
ja habe ich. dann bekomme ich eine Zugriffsverletzung

stahli 16. Nov 2012 18:45

AW: Gleitkommadivision durch Null
 
Jetzt häng mal noch deinen kompletten Monitor hier an.

DelphiUser1 16. Nov 2012 22:04

AW: Gleitkommadivision durch Null
 
War das Ironie oder ist die Zugriffsverletzung auf dem Monitor gemeint?

stahli 16. Nov 2012 22:08

AW: Gleitkommadivision durch Null
 
Sorry, ich meinte einen kompletten Screenshot (oder auch mehrere).
So könnten wir mal sehen, wo der Debuger steh, welche Fehlernachricht etc.

DelphiUser1 17. Nov 2012 11:48

AW: Gleitkommadivision durch Null
 
Liste der Anhänge anzeigen (Anzahl: 2)
okay alles klar, dann habe ich mal zwei Screenshots angehängt.

mkinzler 17. Nov 2012 11:54

AW: Gleitkommadivision durch Null
 
Könntest du den noch etwas kleiner machen? Man kann ja fast etwas erkennen :mrgreen:

Sir Rufo 17. Nov 2012 11:59

AW: Gleitkommadivision durch Null
 
Mach das Bitmap zwischen Picture und LoadFromFile weg!

Popov 17. Nov 2012 12:18

AW: Gleitkommadivision durch Null
 
Lange Rede, kurzer Sinn, ich kann mich auch täuschen, aber du erzeugst aus TImage Komponente deine eigene TPistol Komponente, die du später als PFeuer und PNormal deklarierst (1) aber nicht zu Laufzeit einbindest. Aber das war es schon mit der Höflichkeit, da du davon ausgehst, dass die beiden Komponenten schwuppdiwupp auf dem Formular landen. Tun sie aber nicht. Man kann Komponenten zur Laufzeit einbinden, dann aber richtig. Solltest du das irgendwo in deinem Code (bei Göttern, wie blickst du da durch) es getan haben, dann ignoriere es.

Es kann der Fehler sein, muß aber nicht.


-------------
1) das P ist etwas unglücklich gewählt, da es in der Regel für Pointer steht, ist aber kein Fehler, könnte aber missverstanden werden

DelphiUser1 17. Nov 2012 12:27

AW: Gleitkommadivision durch Null
 
@mkinzler: Tut mir leid, das liegt nicht an mir
@Sir Rufo: Wie gesagt, dann bekomme ich eine Zugriffsverletzung
@Popov: Nicht ganz. Die Bilder werden später Image7 zugeordnet und dort sind sie dann sichtbar, aber das ist ja im Grunde auch nicht das Problem, sondern die Gleitkommadivision beim Laden der Bilder :?

Popov 17. Nov 2012 12:37

AW: Gleitkommadivision durch Null
 
Nicht ganz:

a := 1;
b := a;

das klappt. Hier wird der Wert von a an b übergeben.

bei

TImage1 := TImage2

wird nur die Adresse übergeben, nicht der Inhalt.

Ein Tipp, schon mal was von TBitmap gehört? Du missbrauchst eine Image als Speicherplatz für eine Bitmap?

Popov 17. Nov 2012 12:49

AW: Gleitkommadivision durch Null
 
Ok, die Lösung

:bouncing4: :bouncing4: :bounce1: :bounce1: :bounce2: :bounce2:

Die beiden Bitmaps sind korrupt (irgendwie, keine Ahnung was). Andere Programme können sie lesen und fangen den Fehler ab, TBitmap anscheinend nicht. Kann auch sein, dass sie nicht korrupt sind, nur TBitmap kommt damit nicht klar. Keine Ahnung was es ist, aber es ist es. Konvertiere es z. B. mit IrfanViewer.

Popov 17. Nov 2012 13:18

AW: Gleitkommadivision durch Null
 
Liste der Anhänge anzeigen (Anzahl: 1)
Übriges, kann es sein, dass du sowas in der Art programmierst?

siehe Anhang

DelphiUser1 17. Nov 2012 15:47

AW: Gleitkommadivision durch Null
 
Nicht ganz.
es werden Kreise erzeugt und die muss man zerstören. Ich nutze dafür gerade eine Pistole.
Wäre es möglich, das ich mir den Sourcecode zu deinem Programm mal anschauen kann, das Zerstören der Kreise könnte ich eventuell gut für mein Programm benutzen :-D
Ich habe nun einen anderen (sogar besseren) Weg gefunden, die Schüsse zu animieren.
Trotzdem danke an alle, die mitgeholfen haben und sich die Mühe gemacht haben.
P.s: Soll ich die Exe der Beta-Version des Spiels mal hier posten?

Popov 17. Nov 2012 16:00

AW: Gleitkommadivision durch Null
 
Auch wenn das Spiel kein Knaller ist und ich nichts dagegen habe den Code zu veröffentlichen, das Spiel ist noch nicht fertig. Wenn es fertigt ist, eventuell, aber nicht vorher.

Wenn du aber spezielle Fragen hast, dann frag.

DelphiUser1 18. Nov 2012 01:02

AW: Gleitkommadivision durch Null
 
ja, mich würde interessieren, wie die Blockzerstörung funktioniert?

himitsu 18. Nov 2012 02:57

AW: Gleitkommadivision durch Null
 
Du könntest ja mal die Bilder hochaladen. :roll:

Bitmap ist ein sehr einfaches Format und solange die paar wenigen Kontrolldaten korrekt sind, erzeugen Fehler in den Bildinhalten keinerlei Probleme (außer daß die Farben der betreffenden Pixel nicht stimmen.

Fazit:
Wenn TBitmap das Bitmap nicht lesen kann, dann ist das Bild zu 99,99995 % defekt.

nuclearping 18. Nov 2012 04:40

AW: Gleitkommadivision durch Null
 
Zitat:

Zitat von DelphiUser1 (Beitrag 1191708)
Nicht ganz.
es werden Kreise erzeugt und die muss man zerstören. Ich nutze dafür gerade eine Pistole.
Wäre es möglich, das ich mir den Sourcecode zu deinem Programm mal anschauen kann, das Zerstören der Kreise könnte ich eventuell gut für mein Programm benutzen :-D
Ich habe nun einen anderen (sogar besseren) Weg gefunden, die Schüsse zu animieren.
Trotzdem danke an alle, die mitgeholfen haben und sich die Mühe gemacht haben.
P.s: Soll ich die Exe der Beta-Version des Spiels mal hier posten?

Wenn du nach dem Source eines fremden Projekts fragst, um was daraus zu lernen, dann sag ich's dir hier nochmal: Schau dir mal die Andorra 2D Grafik-Engine, vorallem die Beispiele dazu. :thumb:

Popov 18. Nov 2012 05:37

AW: Gleitkommadivision durch Null
 
Zitat:

Zitat von DelphiUser1 (Beitrag 1191778)
ja, mich würde interessieren, wie die Blockzerstörung funktioniert?

Das ist etwas kompliziert, oder auch nicht, ja nachdem wie man es sieht. Also zuerst ist ein Objekt ein Objekt mit verschiedenen Eigenschaften. Da wäre das Bild, die Größe, die Geschwindigkeit, die Richtung. Objekt kann ein Record oder Klasse mit den Eigenschaften sein. Wird es angeklickt und zerfällt, wird es an eine Prozedur übergeben. Diese erzeugt vier neue Objekte mit einer viertel Größe und Positionen die zusammen das alte Objekt überdecken (hier muss etwas gerechnet werden). Die Teilbereiche der Bitmap werden verteilt. Das alte Objekt wird aufgelöst. Die neuen Objekte bekommen neue Eigenschaften wie Geschwindigkeit, Richtung usw. Das war es. Die Explosion ist das gleiche in grün. Die Prozedur die das alte Objekt in vier Teile zerlegt ist flexibel gestaltet und kann auch in 25 oder 64 Teile zerlegen. Zum Schluß fliegen da auch 64 Bitmaps. Bei über 2000 fängt es langsam an zu ruckeln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 Uhr.
Seite 1 von 2  1 2      

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