Das Notes Forum

Domino 9 und frühere Versionen => ND9: Administration & Userprobleme => Thema gestartet von: troubleseeker am 24.08.17 - 12:07:53

Titel: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes
Beitrag von: troubleseeker am 24.08.17 - 12:07:53
Wenn ich versuche ein extrem simples Programm zu schreiben wie das folgende, gibt es bereits Probleme:

msgbox Cstr(1000*1000)

Beim speichern wird die Zeile rot markiert und im Bemerkungsfeld steht "Overflow". Denselben Fehler gibt es, wenn man zwei Variablen als Integer, Double, Long, etc. deklariert (mit Dim) und diese versucht zu multiplizieren, allerdings dann erst, wenn das Programm ausgeführt wird.  Beim Versuch, das Problem einzuschränken, finden sich die Grenzfälle bei diesen Fällen:

- Msgbox Cstr(180*182+7) '=32767
- Msgbox Cstr((-180)*182-8)  '=-32768
(Zum Vergleich, 2^15 = 32768)

Beide funktionieren, aber geben denselben "Overflow" Fehler wenn die letzte Zahl um eins auf +8 erhöht oder um eins auf -9 verringert wird. Ich kann nicht umhin zu denken, dass dies mit der Zahl 2^16, also 2 Bytes, zu tun hat, da die Addition des Betrages beider Zahlen eins weniger als 2^16 ergibt (mit einer weiteren Stelle reserviert für die 0).

Das Programm zu re-installieren hat nicht geholfen und das Problem lies sich auf anderen Computern reproduzieren. Die Lokation schien unerheblich zu sein, denn es war egal ob es in "postopen" oder einem Button war.

Ich habe einen workaround gefunden, indem ich den Wert in einem Fehld hatte und Cdbl benutzt habe, um auf das Feld zuzugreifen und die Zahl auf die respektiven Variablen zu übergeben. Was soll das Ganze?

Außerdem ist dies mein erster Beitrag hier, programmiere erst seit ein paar Wochen mit Lotus Notes und bin ziemlich unerfahren beim programmieren allgemein.
Titel: Re: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes
Beitrag von: jBubbleBoy am 24.08.17 - 13:08:23
Das hat etwas mit den Datentypen in Notes zu tun, führe mal diesen Code aus:
Code
Dim a1#, a2#
a1 = 1000
a2 = 1000
MsgBox typename(1000)
MsgBox a1 * a2 & " => " & typename(a1)
Titel: Re: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes
Beitrag von: Tode am 24.08.17 - 21:15:42
Das Problem ist -wie Bubbleboy etwas verklausuliert geschrieben hat: bei einer Multiplikation von 1000 mit 1000 werden für beide Werte intern Integer- Variablen allociert. Damit geht Notes davon aus, dass das Ergebnis auch eine Integer ist, und weil die dann > 32.567, deshalb Overflow.

Schreibst Du 1000.0 * 1000, dann wird von einem Double links ausgegangen und für das Ergebnis wieder ein Double allokiert > kein Overflow. Das gleiche passiert, wenn Du die 1000 sauber einer als Double deklarierten Variable zuweist, und diese dann multiplizierst.
Titel: Re: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes
Beitrag von: Werner Götz am 29.08.17 - 21:07:52
Aber die Alternative zu Integer ist dann doch eher Long und nicht Double ?!?
-Werner
Titel: Re: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes
Beitrag von: Tode am 29.08.17 - 23:10:04
Ja, wenn man die Variablen deklariert ist das richtig, wenn man aber mit Konstanten wie im obigen Beispiel rechnet, kriegt man da kein Long hin...
Titel: Re: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes
Beitrag von: jBubbleBoy am 30.08.17 - 08:09:14
... doch das geht, entweder über die Datenkonvertierung clng oder mit der Suffix-Schreibweise:
Code
MsgBox 1000&  * 1000 & " => " & TypeName(1000&)	
MsgBox 10%  * 10 & " => " & TypeName(10%)