mikrocontroller.net

Forum: PC-Programmierung Frage bzgl. Datentypen in VB6


Autor: Willi S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie ich schon vor 2 Wochen gepostet habe, benutze ich VB6 mit der D2xx 
Dll um aus einer Schnittstelle zu lesen. Das byteweise Auslesen 
funktioniert jetzt 1A. Nur mit der Umrechnung habe ich noch große 
Probleme.

Ich lese aus der Schnittstelle:

Byte_0 = 147 'Least Significant Byte
Byte_1 = 82
Byte_2 = 50
Byte_3 = 185 'Most Significant Byte

Die Epochezeit setzt sich aus diesen 4 Bytes zusammen. Die Berechnung 
lautet also: EpochTime = 147 * 2^0 + 82 * 2^8 + 50 * 2^16 + 185 * 2^32

Ergibt mit Taschenrechner: 794572247699
Mit VB6: 3297939

Da gehen einige Stellen verloren. Habe es mit vielen Datentypen probiert 
- sogar Variant. Leider immer das gleiche Problem.
Kann man eine solche große Zahl mit einer annehmbaren Genauigkeit 
überhaupt mit VB6 ermitteln?

Danke!

lg,
Willi

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Berechnung ist grundsätzlich ok.
Nur wirst du das Problem haben, dass VB die Berechnung im Zahlenraum 
Word (oder Integer, also 16 Bit) durchführt, während du im Zahlenraum 
DWord (oder Long) arbeiten musst.

Versuch einfach mal aus den Byte_x Werten jeweils einen DWord zu machen, 
dann sollte es eigentlich funktionieren. Wie das geht kann ich nicht 
sagen, dazu reicht meine VB6 Kenntnisse nicht mehr. Aber 
schlimmstenfalls kann man immer noch die Byte_x Variablen zunächst in 
DWord Variablen umkopieren und dann mit diesen rechnen.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Willi,

> Die Epochezeit setzt sich aus diesen 4 Bytes zusammen. Die Berechnung
> lautet also: EpochTime = 147 * 2^0 + 82 * 2^8 + 50 * 2^16 + 185 * 2^32

Das ist leider falsch. Die Berechnung lautet EpochTime = 147 * 2^0 + 82 
* 2^8 + 50 * 2^16 + 185 * 2^24.

Gruß
Markus

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hilft dir das:
http://www.vbdotnetheaven.com/Blogs/BlogDetail.asp...

1 Minute mit Gooogle.

Autor: Willi S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmals danke für die Antwort.
Es ist immer wieder sehr unangenehm, Berchnungen mit großen Zahlen 
durchzuführen. Da hatte ich schon oft immer wieder Probleme mit der 
Zahlenrepräsentation.
Ich werde mich jetzt mal weiter schlau machen. Mit deinen Tipps werde 
ich aber schon weiter kommen!

Danke!

lg,
Willi

Autor: Willi S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok! Danke für die Richtigstellung!

1 Byte = 8 Bits

Danke!

Autor: Willi S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger

DWords gibt es soviel ich weiß in VB6 gar nicht! Ich kenne nur den 
Datentyp Long. Mit Decimal müsste es gehen. Nur weiß ich nicht wirklich, 
wie man den richtig verwendet, da es ja kein Dim Variable As Decimal 
gibt.
Soviel ich weiß, hat Decimal 28 Stellen - egal ob vor oder nach dem 
Komma. Wenn ich Decimal verwenden würde, müsste eigentlich das Ergebnis 
stimmen, da ich ja eh nur ca. 18 Stellen brauche?!

lg,
Willi

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Willi S. schrieb:
> @  Karl heinz Buchegger
>
> DWords gibt es soviel ich weiß in VB6 gar nicht!

Ooops. Du hast recht.
Dann also Long. Wobei dann die Behandlung eines Vorzeichens noch viele 
Stunden Spass verspricht.

Autor: Willi S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So! Nachdem mir da schon oft geholfen wurde und ich auch zu diesem 
Problem eine Lösung gefunden habe, möchte ich sie hier posten.

Wie ich schon erwähnt habe, hatte ich ein Problem mit der Genauigkeit 
bei den Berechnungen.
Wie ich richtig geschrieben habe, muss der Datentyp "Decimal" verwendet 
werden. Dieser Datentyp ist eigentlich ein "Stiefkind" von VB6, da er 
nicht "direkt" verwendet werden kann. Vielmehr ist er eine Untergruppe 
des Datentyps "Variant"

Auszug aus der MSDN:

Speichert 128-Bit-(16-Byte-)Werte mit Vorzeichen, die 
96-Bit-(12-Byte-)Ganzzahlen darstellen, welche mit einer variablen 
Potenz zur Basiszahl 10 skaliert werden. Der Skalierungsfaktor gibt die 
Anzahl der Stellen rechts vom Dezimalzeichen an und liegt im Bereich von 
0 bis 28. Bei einer Skalierung von 0 (keine Dezimalstellen) ist der 
größte mögliche Wert +/–79.228.162.514.264.337.593.543.950.335 
(+/-7,9228162514264337593543950335E+28). Bei 28 Dezimalstellen ist der 
größte Wert +/-7,9228162514264337593543950335, und der kleinste Wert 
ungleich 0 (null) ist +/-0.0000000000000000000000000001 (+/-1E-28).


Meine Vorgehensweise:

Dim Byte_0 As Variant
Dim Byte_1 As Variant
Dim Byte_2 As Variant
Dim Byte_3 As Variant
Dim EpochTime As Variant

EpochTime = CDec(Byte_0) + CDec(Byte_1 * 2 ^ 8) + CDec(Byte_2 * 2 ^ 16) 
+ CDec(Byte_3 * 2 ^ 24)

Und siehe da! Es kommt das richtige Ergebnis raus. Vielleicht hat jemand 
von euch mal ein ähnliches Problem und kann es dann mit meinem Beispiel 
lösen!

Danke!

lg,
Willi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.