vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
Zahlen in Vbasic6 
Autor: Maeiyr
Datum: 11.05.20 14:10

Hallo, ich habe folgendes Problem, ich musste nach langer Zeit VB6 neu auf einem Rechner installieren.
Läuft alles super, aber intern werden Zahlen nur Integer gerechnet. Kann Variablen integer, double etc. alles festlegen, alles ok, kein Problem.
Bei einer Berechnung zB. der Width-Funktion eines Shapes kommt bei >32768 Error 6, zB. 8*4500/1310. Wo kann ich die interne Berechnugnauf Double umstellen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen in Vbasic6 
Autor: Souffleurlos
Datum: 11.05.20 16:46

Hallo,

Shape ist ein Objekt. Du kannst den Datentyp einer Eigenschaft des Objekts nicht ändern.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen in Vbasic6 
Autor: Manfred X
Datum: 11.05.20 16:56

Hallo!

Du könntest im Code eine Konvertierungsfunktion für Zahlen und einen
passenden Zieltyp für das Ergebnis einzusetzen.
(Auch Zwischenergebnisse können einen Überlauf im Ziel erzeugen.)
https://www.vbarchiv.net/commands/cmd_cdbl.html

Bei der Zuweisung des Berechnungsergebnisses z.B. auf die "Width"-Eigenschaft
solltest Du ebenfalls eine geeignete explizite Konvertierung auf den
Zieltyp vornehmen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen in Vbasic6 
Autor: Kuno60
Datum: 11.05.20 20:34

Hallo,
der Integer-Bereich bei VB6 geht nur bis 32767.
Bei dieser Rechnung 8*4500/1310 kommt es schon bei 8*4500=36000 zu einem Überlauf.
Konstante ganze Zahlen sind immer vom Typ Integer, aber du kannst auch ein anderen Typ durch ein Typkennzeichen angeben.
# kennzeichnet eine Zahl als Double.
Also 8# * 4500# / 1310# wird komplett als Double berechnet und löst keinen Fehler aus.
Siehe: https://www.vbarchiv.net/commands/cmd_datentypen.html
(Übrigens bei NET, wurden die Typkennzeichen beibehalten.)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen in Vbasic6 
Autor: markusxy
Datum: 11.05.20 22:58

@Kuno60

8 * (4500 / 1310)

Kannst du erklären, warum es so funktioniert?
Wenn ja, dann verstehst du das Problem möglicherweise.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen in Vbasic6 
Autor: Maeiyr
Datum: 12.05.20 06:34

Klar verstehe ich das, durch die Klammerrechnung wird die 32er Grenze nicht gerissen, was ich nicht begreife, wieso VB auf einmal intern nur noch Integer rechnet und nicht mehr double. Denn ich glaube mich zu erinnern, 8*4500/1310 konnte ich auch ohne Klammern oder extraKennung # im Direktfenster berechnen.
Vielen Dank an alle die was geschrieben haben.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen in Vbasic6 
Autor: Manfred X
Datum: 12.05.20 07:47

Wenn VBB6 intern mit Integern rechnen würde, käme bei
der Division ein falsches Ergebnis. Es geht um den Datentyp.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen in Vbasic6 
Autor: Kuno60
Datum: 13.05.20 22:04

Hallo markusxy,

bei 8 * (4500 / 1310) tritt natürlich kein Überlauf auf und das Ergebnis ist dasselbe. Außerdem wird in diesem Fall mit Double gerechnet.
Eine Division von 2 Interger-Zahlen liefert das Ergebnis als Double, es sei denn man verwendet \.
Auch Folgeoperationen werden mit Double gerechnet.
Bei 8000000 * (4500 / 1310), tritt kein Überlauf auf.
Gebrochene Zahlen (123456.789) ohne Typkennzeichen, sind immer Double.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen in Vbasic6 
Autor: markusxy
Datum: 14.05.20 20:45

Da beide Operationen gleichrangig sind, wird bei VBA/VB6 von links nach rechts abgearbeitet.
Die Zahl 8 und 4500 werden als 2 Byte Integer Werte gespeichert und es wird eine 2 Byte Integer Multiplikation durchgeführt.
Da kommt es dann zum Überlauf.
Wäre kein Überlauf da, würde danach das Ergebnis in Double konvertiert und mit dem zweiten Wert dividiert.
Die Division ist wie schon aufgezeigt immer eine Gleitkomma Berechnung, außer man verwendet eine Integer Division.

Das zentrale beim Rechnen, ist das immer beide Zahlen vom selben Datentyp sein müssen.
Wenn du also eine Zahl mit dem Long Typkennzeichen versiehst, dann gibt es kein Problem, weil auch die zweite Zahl automatisch konvertiert wird (wobei sich real nichts verändert), aber der Compiler führt eine 4Byte Integer Multiplikation durch.

z.B. 4& * 4500 / irgendwas.

Ich hoffe, das klärt dich Sache und nein, dass ist nichts VBA/VB6 spezifisches, sondern ist beim Großteil der Programmier-Sprachen so.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Zahlen in Vbasic6 
Autor: markusxy
Datum: 14.05.20 20:52

Schön erklärt.
Ich war nur von deiner Aussage:

Zitat:

Konstante ganze Zahlen sind immer vom Typ Integer


irritiert.
Da war aber nur etwas unglücklich formuliert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel