This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

Anderes Scriptverhalten in Opensim 0.9.2.1 XEngine führt zu Scriptfehlermeldung
#1
Anderes Scriptverhalten in Opensim 0.9.2.1 XEngine führt zu Scriptfehlermeldung

Hallo zusammen, hier eine kurze Warnung an alle Scripter das sich die Opensim Version 0.9.2.1 anders als vorangehende Versionen verhält.

Konkret werden nun Eingaben und Berechnungen die zu einer Division durch 0 führen als Scriptfehler an alle ausgegeben.
Mathematisch ist dies Verhalten ja korrekt, aber entspricht nciht dem bisherigen. Bisher wurden diese Fehlermeldungen unterdrückt.

Das fürt dazu das Scripte die bisher problemlos liefen auf einmal Scriptfehler auf der Sim produzieren.
Dumm daran ist das der Meldung nicht entnehmbar ist in welcher Zeile des Scriptes diese auftreten.

Bei welcher Version genau der Umstieg auf dieses Verhalten erfolgte habe ich nicht ausgetestet.

Keinen Fehler gab es unter 0.8.2, 0.9.0.1
Fehler gab es unter 0.9.2.1


Tron
Zitieren
#2
Hallo Tron,

Auf alle Fälle ein guter Hinweis. Danke dafür!

Wenn ältere Skripte allerdings die Division durch 0 nicht als Ausnahmefall behandeln, ist das nicht so toll. Benutzt man das aus einer solchen Division entstandene falsche Ergebnis, kann das die Ursache für ein undefiniertes Verhalten des Skriptes sein. Daher ist es gut, daß es diese neue Fehlermeldung gibt. Ich möchte hier niemanden niedermachen. Es ist eine große Leistung, wenn sich jemand selbstständig das Programmieren beibringt. Allerdings tritt man unter Umständen in einige Fallen. :-)

Das geht jetzt nicht an Deine Adresse Tron, Dir wird das sicher klar sein. Nur damit es allgemein verständlicher wird. Ich würde eine Division durch 0 immer abfangen, und den Fehlerfall behandeln. Was dabei sinnvoll ist, hängt vom Script und dem gewünschten Verhalten ab. 

Pseudocode:
Code:
a=Dividend;
b=Divisor;

if(b == 0)
{
    /* Fehlerbehandlung z.B.*/
    ergebnis = maximaler Wert des Datentyps
}
else
{
    /* Weiter im Text */
    ergebnis = a / b;
}

Das Ergebnis auf seinen maximal möglichen Wert zu setzen, ist aber nur eine schlechte Krücke. Besser ist es, wenn man sich das Problem anschaut, analysiert und eine zum Problem passende Lösung findet. Möglich wäre es auch, den Verarbeitungszyklus, in dem die Division durch 0 auftritt, zu überspringen. Es kann aber auch ein logischer Fehler im Algorithmus vorliegen, wenn es zu so einer Division kommt.

In jedem Fall sollte das einen stutzig werden lassen!

Ciao Jules!
Mein Heimatgrid: https://swissgrid.opensim.ch
Zitieren
#3
Hallo Jules,

klar gehört ein Division durch 0 immer behandelt. Die Frage allerdings ist wo.
Bei einem klassischen Programmiersystem ist das klar Aufgabe des Programmierers.

Hier in SL/Opensim programmiert man aber nicht auf der "C Basis" herum. Man ist als Scripter nur Nutzer fertiger LSL/OSSL Module.
Man gibt Überabeparameter an die LSL/OSSL Routine und erwartet gültige Ausgaben und im Fehlerfall einen Fehlercode als Rückgabewert.

Normalerweise kümmert sich daher der C Routinen Programmierer darum Fehler abzufangen und sein Modul wasserdicht zu machen.
Sonst wäre das gesamte System auch sehr leicht böswillig zu komprimittieren.

Ein typisches Verhalten dieser LSL Implementierungen ist es daher dem Scripter Rückmeldungen in Form von Rückgabeparametern zukommen zu lassen, die jedoch dem Enduser verborgen bleiben.

Beispiel:

https://wiki.secondlife.com/wiki/LlDetectedKey
Aus der Funktionsbeschreibung:

Function: key llDetectedKey( integer number );
Returns a key that is the UUID of the detected object or avatar number.
number does not support negative indexes. Returns an empty key if number does not correspond to a valid sensed object or avatar.

Caveats:
If number is out of bounds the script continues to execute without an error message.

Hier wird also explizit angegeben das bei einem ungültigen Eingabewert KEINE Fehlermeldung erfolgt.
Dafür wird ein ZERO_KEY zurück geliefert, als Zeichen das die Abfrage erfolglos war. Auf diesen prüft dann der Scripter ab bevor er mit dem Ergebnis weiter arbeitet.

Anders steht in der SL Beschreibung für Division das eine Division durch 0 einen runtime Fehelr auslöst. Hier muss also der Scritpter Vorsicht walten lassen.
https://wiki.secondlife.com/wiki/LSL_Operators

Note: Modulus (%), like division, cause a Script run-time error. Math Error when its second operand equals zero.
Das eine Division durch 0 einen runtime Fehler auslöst. Hier muss also der Scripter Vorsicht walten lassen.

Wie auch immer man solche Dinge handhabt: Es sollte Systemweit einheitlich, und bekannt sein.
Wie diese 2 Beispiele aber zeigen, ist dies nicht mal in SL der Fall.
Und für die Opensim Implementierung habe ich eine solche Doku noch nirgends gesehen.

Problematisch daran ist das viele Funktionen (besonderes trigonometrische) Nullwerte zurückliefern.
Rechnet man mit Float und erhält Ergebnisswerte zwischen 0 und 2PI, dann reicht es aber oft eine sehr kleine "Verunreinigung"  wie + 0.001 dazu zu addieren um nie 0 zu bekommen.
Der Fehler im Ergebnis ist verschmerzbar, der Gewinn jedoch - Berechnungszeit in einer Echtzeitroutine - ist kostbar.

viele Grüße Tron
Zitieren
#4
Ich weiss was Du meinst Tron. Wenn es innerhalb einer Sprache nicht konsistent zugeht, ja das kann frustrierend sein, und einem den Spass am Programmieren rauben. Aber Du weisst doch: "Nur das Genie beherrscht das Chaos!" ;-)
Mein Heimatgrid: https://swissgrid.opensim.ch
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste