Autor Thema: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes  (Gelesen 1845 mal)

Offline troubleseeker

  • Frischling
  • *
  • Beiträge: 1
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.

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes
« Antwort #1 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)
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes
« Antwort #2 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.
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Werner Götz

  • Aktives Mitglied
  • ***
  • Beiträge: 249
  • Geschlecht: Männlich
Re: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes
« Antwort #3 am: 29.08.17 - 21:07:52 »
Aber die Alternative zu Integer ist dann doch eher Long und nicht Double ?!?
-Werner

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes
« Antwort #4 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...
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Overflow bei Multiplikationen mit einem Ergebnis>2 bytes
« Antwort #5 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%)	
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz