V 1.9 / Programmabstürze ohne Fehlermeldung ...

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Krause
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Mo, 08. Jan 2007 8:55
Wohnort: In Thüringen

V 1.9 / Programmabstürze ohne Fehlermeldung ...

Beitrag von Krause »

Programmabsturz nach Division durch Null ...

Niemand ist absolut fehlerfrei, um so mehr ist man in komplexen Programmabschnitten auf eine zutreffende Fehlermeldung angewiesen. Version 1.9 verabschiedet sich absolut ohne Fehlermeldung nach (hier vereinfacht dargestellt)

Code: Alles auswählen

A:=1; B:=0
C:=Round(A/B, 8)
MfG
Joachim
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14656
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Schau doch mal nach, ob es ein XPPFATAL.LOG gibt. Da sollten nähere Infos drin stehen zum Fehlergrund.

Jan
Krause
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Mo, 08. Jan 2007 8:55
Wohnort: In Thüringen

Beitrag von Krause »

Hi Jan,

- keine Fehlermeldung
- keine XPPFATAL.LOG.

Das Unberechenbare daran ist die Tatsache, dass am Anfang einer Test-Main der Wert 0,00000000 zurückgegeben wird. Die Ursache habe ich noch nicht herausgefunden. Zwischendurch habe ich einen DLL-Aufruf, dort wird aber kein Error - Codeblock gesetzt.

MfG
Joachim
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Joachim,
Ursache ist Division durch 0!
Dies wird (wenn ich mich recht erinnere) nicht in der Standard-Errorsys abgefangen - da solltest/mußt Du entsprechend das ganze modifizieren...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Krause
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Mo, 08. Jan 2007 8:55
Wohnort: In Thüringen

Beitrag von Krause »

Hi Martin,

dass habe ich dann auch gemacht (Wertebereichsüberprüfung vor Codeausführung) in einer eigenen internen PrivatRound() - Funktion. Irritierend ist jedoch der Rückgabewert "0,00000000" am Anfang der Test-Main.

Mit freundlichen Grüßen
Joachim
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

in der Erorsys wird das mit einem Error 0 bearbeitet. Scheint also doch abgefangen zu werden.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi,

zeig uns doch mal deinen kompletten Code. oder fang mit einer If-Abfrage den Devisor ab.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
dann ist ja gut - ich kann mich nur noch dunkel an diverse Postings zu diesem Problem vor einiger Zeit in den Alaska-Newsgroups erinnern...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Martin Altmann hat geschrieben:Hallo Manfred,
dann ist ja gut - ich kann mich nur noch dunkel an diverse Postings zu diesem Problem vor einiger Zeit in den Alaska-Newsgroups erinnern...
Viele Grüße,
Martin
Xbase++ und Clipper liefern zwar bei nWert / 0 einen Wert zurück, (meist ist 0 ja auch nicht genau 0 ;-) ) aber das hilft nur insoweit, dass das Programm nicht abstürzt (bzw. nicht abstürzen dürfte ;-) ).

DAS Problem besteht aber weiterhin insoweit, dass das Ergebnis nicht richtig ist, da eine Division durch 0 nicht erlaubt ist. Je nach Anwendung kann das gravierende Folgen haben !

Der Compiler kann das nicht abfangen, das muss der Entwickler tun.
In allen Situation in denen eine Division durch 0 möglich ist, muss man diese durch Vorprüfung verhindern :!:
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hubert,
ich habe damit ja nicht gemeint, dass eine Division durch 0 OK ist!
Früher gab es einen Laufzeitfehler, der genau das besagte.
Und dann gab es das nicht mehr, sondern nur einen SPT, ohne Log.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

XppFatal.LOG nach normalem Fehler und es wird ein STACK Fehler angeführt ?

meist ist dann ein Fehler in der angepaßten XppError.PRG die Ursache:

Ein normaler Fehler tritt auf,
XppError() will ihn abfangen, aber der Code ist auch Fehlerhaft ...
XppError() wird nun aufgerufen um diesen Fehler in der Fehlerroutine abzufangen.
Falls dabei wieder die fehlerhafte Stelle im Errorhandler aufgerufen wird, läuft es in eine Endlosschleife bis der STACK voll ist.

Ähnlich verhält es sich mit einer rekursiven Funktion die zu tief verschachtelt ist oder gar keine gültige Endebedingung hat.
In einem Beispiel war nach etwa 3100 Aufrufen die XppFatal.LOG erreicht.

Ein Problem aus DOS Tagen tritt heute nicht mehr auf:

alle Dateihandles sind verbraucht, aber die XPPERROR.LOG soll noch geschrieben werden ... das führte zu einem Fehler und die Recursion in den Programmabsturz war da. Unter Xbase++ wird es wohl immer einen Handle geben ;-)
Gruß
Hubert
Krause
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Mo, 08. Jan 2007 8:55
Wohnort: In Thüringen

Beitrag von Krause »

Hi

muss mich nun doch selbst korrigieren, innerhalb einer DLL - Funktion konnte es unter bestimmten Bedingungen vorkommen (Fehlerhafter Code),
das ein Error - Codeblock

Code: Alles auswählen

{ |e| Break(e)} 
"stehen geblieben" war, bleibt also nur noch die Frage offen, warum

Code: Alles auswählen

LOCAL A:=1, B:=0
? A / B                    ---> 0 
? Round( A / B , 8)        ---> 0,00000000 
ergibt und keinen Laufzeitfehler bzw. was denn Sinnvoller währe ...

Mit freundlichen Grüßen
Joachim
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Krause hat geschrieben: ergibt und keinen Laufzeitfehler bzw. was denn Sinnvoller währe ...
zu 1. in Clipper war es auch schon so ;-)
zu 2. ich habe keine Ahnung was sinnvoller ist.

Auf jeden Fall muss das Programm - und damit WIR - sicher stellen, dass es nicht vorkommen kann.
Gruß
Hubert
Antworten