Archiv verlassen und diese Seite im Standarddesign anzeigen : Bytes aus einem Array in eine Word-Variable
Hallo,
ich habe 5 einzelne Bytes, die jeweils einen Wert zwischen 0-9 haben, in einem Array platziert. Diese einzelnen Bytes beschreiben jeweils eine Ziffer einer 5-stelligen Zahl.
Nun muss ich diese Ziffern zu einer Zahl zusammenführen, mit der man Rechnen kann. Der Wert dieser Zahl kann 2^16 nicht überschreiten. Datentyp Word sollte also reichen.
....aber wie mache ich das ??
Für Tips wäre ich sehr dankbar !!
Daniel
robby-fant
26.08.2006, 09:31
Nimm die ASCII-Code der Zahlen in die Bytes, weil du eh nur eine zahl darstellen möchtest und wandelst diese 5 in einem Gesamtstring und mit Val(Str) hast du die Zahl.
darwin.nuernberg
26.08.2006, 10:21
Nimm eine Word Variable und ein Byte Array
Dann weise dem Word die Erste Variable zu,
schiebe das Word um 8-Bits nach oben (left)
und füge Deinen zweiten Wert hinzu:
DIM W_Var as word
DIM B_Array(2) as byte
W_Var = &B0000000000000000 ' = 0 (Binäre Schreibweise)
B_Array(1) = 9 ' = 00001001
B_Array(2) = 1 ' = 00000001
print bin(B_Array(1))
print bin(B_Array(2))
W_Var = B_Array(1) ' = 0000000000001001 = 9
print bin(W_Var)
' dieses um 8-Bit nach links (in das obere Byte) schieben
Shift W_Var, Left , 8 ' = 0000100100000000 = 2304
print bin(W_Var)
' und den zweiten Wert hinzu Odern (addieren)
W_Var = W_Var Or B_Array(2) ' = 0000100100000001 = 2305
print bin(W_Var)
End
Ist zwar etwas an Deinem Ziel vorbei aber
Du kannst ja auch nur um vier Bit nach links verschieben
dann bekommst Du aber immer noch nur vier Werte in ein Word.
Der Vorteil ligt darin, dass es schneller geht (Rechenzeit) und dass Du dies logisch abfragen kannst.
DIM W_Var as word
DIM W_Temp as word
DIM B_Array(4) as byte
W_Var = &B0000000000000000 ' = 0 (Binäre Schreibweise)
B_Array(1) = 9 ' = 00001001
B_Array(2) = 1 ' = 00000001
B_Array(3) = 1 ' = 00000001
B_Array(4) = 1 ' = 00000001
print bin(B_Array(1))
print bin(B_Array(2))
print bin(B_Array(3))
print bin(B_Array(4))
'Sicherheitshalber die oberen 4-Bit ausmaskieren um ein versehentliches Überschreiben zu verhindern.
B_Array(1) = B_Array(1) AND &B00001111
B_Array(2) = B_Array(2) AND &B00001111
B_Array(3) = B_Array(3) AND &B00001111
B_Array(4) = B_Array(4) AND &B00001111
W_Var = B_Array(1) ' = 0000000000001001
' dieses um 4-Bit nach links schieben
Shift W_Var, Left , 4 '
'dann die vier Bit hinzu Odern
W_Var = W_Var OR B_Array(2) ' = 0000000010010001
' wieder um vier Bit nach links
Shift W_Var, Left , 4 '
' wieder vier Bit hinzu
W_Var = W_Var OR B_Array(3) ' = 0000100100010001
' wieder um vier Bit nach links
Shift W_Var, Left , 4 '
' wieder vier Bit hinzu
W_Var = W_Var OR B_Array(4) ' = 1001000100010001
print bin(W_Var)
' 4. Zahl Abfragen:
W_Temp = W_Var AND &B1111000000000000
Shift W_Temp, right,12
Print W_Temp ' = 9
End
robby-fant
26.08.2006, 10:38
.....ich habe 5 einzelne Bytes, die jeweils einen Wert zwischen 0-9 haben, in einem Array platziert. Diese einzelnen Bytes beschreiben jeweils eine Ziffer einer 5-stelligen Zahl.....
...entweder muss 9111 herauskommen oder 1119
Vielen Dank für eure Antworten.
Darwin, Deinen Vorschlag habe ich mir angschaut...leider nicht ganz das, was ich brauche.
Byte_array(1)=6
Byte_array(2)=4
Byte_array(3)=5
Byte_array(4)=1
Rauskommen soll Word_var=6451
Bin allerdings so weit, dass ich die Bytes des Arrays lieber in einen String verpacken würde. Super wäre es, wenn man diesem String vorne auch noch ein "+" oder "-" anfügen könnte.
Robby-Fant:
> Nimm die ASCII-Code der Zahlen in die Bytes, weil du eh nur eine zahl darstellen möchtest und wandelst diese 5 in einem Gesamtstring und mit Val(Str) hast du die Zahl.
Kannst Du mirdas nochmal genauer erklären ??
Viele Grüße
Daniel
darwin.nuernberg
26.08.2006, 11:16
...entweder muss 9111 herauskommen oder 1119
Das wäre dann etweder ein String oder du musst jede einzelne Zahl potenzieren
Beispiel 9876
also
9 * 1000 = 9E3 = 9*10^3
8 * 100 = 8E2 = 8*10^2
7 * 10 = 7E1 = 7*10^1
6 * 1
Dim W_var As Word
Dim W_temp As Word
Dim B_ar(4) As Byte
Dim B_temp As Byte
Dim S_var As String * 4
Dim S_temp As String * 4
Dim B_len As Byte
B_ar(1) = 9
B_ar(2) = 8
B_ar(3) = 7
B_ar(4) = 6
W_var = 0
' Bilden der Zahl:
W_temp = B_ar(1) * 1000
W_var = W_temp
W_temp = B_ar(2) * 100
W_var = W_var + W_temp
W_temp = B_ar(3) * 10
W_var = W_var + W_temp
W_temp = B_ar(4) * 1 ' Pauschal mach aber keinen Sinn (*1)
W_var = W_var + W_temp
Print W_var
' Zum Auswerten muss aber ewas mehr Aufwand getrieben werden
' Entweder in einen String umwandlen und dann ein einzelnes Zeichen
' mit MID herauspicken und wieder in eine Zahl zurückverwandeln (mit VAL)
' oder Matematisch (um auf Zahlenebene zu bleiben)
' dann muss noch mehr Aufwand getrieben werden,
S_var = Str(w_var)
Print S_var
S_var = Format(s_var , "0000") ' Damit auf jedenfall 4-Zeichen erstellt werden auch bei 0-Werten (Führende Nullen)
S_temp = Mid(s_var , 1 , 1)
Print "Zeichen der Zahl 1 = " ; S_temp
B_temp = Val(s_temp) ' damit die Zahl als Zeichen wieder eine Zahl wird
Print "Wert der 1. Zahl = " ; B_temp
S_temp = Mid(s_var , 2 , 1)
Print "Zeichen der Zahl 2 = " ; S_temp
B_temp = Val(s_temp) ' damit die Zahl als Zeichen wieder eine Zahl wird
Print "Wert der 2. Zahl = " ; B_temp
S_temp = Mid(s_var , 3 , 1)
Print "Zeichen der Zahl 3 = " ; S_temp
B_temp = Val(s_temp) ' damit die Zahl als Zeichen wieder eine Zahl wird
Print "Wert der 3. Zahl = " ; B_temp
S_temp = Mid(s_var , 4 , 1)
Print "Zeichen der Zahl 4 = " ; S_temp
B_temp = Val(s_temp) ' damit die Zahl als Zeichen wieder eine Zahl wird
Print "Wert der 4. Zahl = " ; B_temp
End
'
' Eine Modulo kann nicht direkt verwendet werden da diese 'nur' einen
' Integer Wert zurückliefert.
' Also bedeuted dies noch mehr Arbeit...
EDIT:
Was soll das jetzt mit dem Vorzeichen???
Nix kapito.
Wann soll eine neg. Vorzeichen entstehen und vor allem WIE (bei dikreten Werten aus unterscheidlichen diskreten Variablen?????"
Überleg mal.
robby-fant
26.08.2006, 11:41
davon reden wir doch die ganze Zeit, du machst es zu kompliziert.
robby-fant
26.08.2006, 11:47
stringzahl1=CHR(var) 'var ist der ascii-code-wert eines buchstaben(zahl "1" zb ist auch ein buchstabe), ascii-tabelle mit google suchen,stringzahl1 ist ein string der länge 1 (ohne returnzeichen usw).
gesamtstring=stringzahl1 + stringzahl2...
wordwert=val(gesamtstring)
Darwin, Robby-Fan,
vielen Dank !!
Den letzten Vorschlag werde ich gleich testen.
Habe inzwischen mal das hier probiert:
$crystal = 3686400
$regfile = "m8def.dat"
Dim Xstring As String * 20
Dim Xbyte(21) As Byte At Xstring Overlay
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , Rs = Portd.2 , E = Portd.3
Config Lcd = 16 * 2
Initlcd
Xbyte(1) = 5
Xbyte(2) = 4
Xbyte(3) = 2
Xbyte(4) = 5
Xbyte(5) = 8
Xbyte(6) = 3
Xbyte(7) = 8
Xbyte(8) = 0
Cls
Lcd "test"
Lowerline
Lcd Xstring
End
Im LCD steht nachher auch Test in der oberen Zeile.
Dadrunter steht nur Müll. Was mache ich falsch ??
Daniel
darwin.nuernberg
26.08.2006, 12:20
Du musst die Zahl in einen String umwandeln,
das LCD meinst sonst was anderes.
Xsting = str(Xbyte(1)) ' zum Biespiel
außerden was soll schon angezeigt werden?
Du hast in Xstring ja noch nix reigeschrieben, da ist eben zufällig was drin.
Also vorher Xsting="" oder was anderes "1234567890" definieren.
Nur eine Variable definieren ist nicht alles,
die solltest Du auch noch initialisieren, wenn Du sauber programmieren willst, also einen definierten Wert zuweisen.
darwin.nuernberg
26.08.2006, 12:27
stringzahl1=CHR(var) 'var ist der ascii-code-wert eines buchstaben(zahl "1" zb ist auch ein buchstabe), ascii-tabelle mit google suchen,stringzahl1 ist ein string der länge 1 (ohne returnzeichen usw).
gesamtstring=stringzahl1 + stringzahl2...
wordwert=val(gesamtstring)
Viele Wege führen nach Rom....
(Mein Weg ist schöner erklärt und auch in andere Basic Versionen portierbar)
Du musst bedenken nur kurze Fetzen sind nicht besonders Hilfreich, mach doch (nicht für mich) einen leserlichen Code draus.
Dann können auch andere Progrmmieranfänger dies besser vestehen
Darwin, so ganz leer kann xString ja nicht sein:
Dim Xstring As String * 20
Dim Xbyte(21) As Byte At Xstring Overlay
wenn ich etwas ins Array schreibe, müsste das doch auch im String liegen, oder habe ich da nen Denkfehler ??
Daniel
darwin.nuernberg
26.08.2006, 16:36
Darwin, so ganz leer kann xString ja nicht sein:
Dim Xstring As String * 20
Dim Xbyte(21) As Byte At Xstring Overlay
wenn ich etwas ins Array schreibe, müsste das doch auch im String liegen, oder habe ich da nen Denkfehler ??
Daniel
Schau doch mal nach was mit "PRINT Xstring" rauskommt....
Real am Prozessor nicht im Simulator, also eine RS232 Verbindung mit Terminal muss es schon sein, dann kannst Du mit gewissheit sagen was drin steht.
Mit Overlay' s habe ich noch nicht gearbeitet.
Könnte es sein dass im Overlay nur die Adresse des Strings drin steht und nicht der String an sich?
...
Ich hab grad mal in der Anleitung nachgelesen, Scheint tatsächlich so zu sein, wenn Du mit Overlay arbeitest, dann wird hiermit die Adresse bzw. die Speicherzelle definiert nicht die Variable an sich.
Ist was für RUNAWAY (Fortgeschrittene) Programmierung :-b
Auf jeden Fall so wie Du das da machen willst klappt es nicht (so wie duc dachtest).
Schau Dir mal die DIM Syntax an und die Beispiele dazu.
..wenn ich etwas ins Array schreibe, müsste das doch auch im String liegen, ..
Das ist korrekt. Auf diese Weise kann man am besten byte-weise beliebige andere Feldtypen verschicken und empfangen
Variante string byteweise lesen:
DIM mystring as string * 20
DIM adr as word
DIM einbyte as byte
mystring = "Hello, world"
adr = varptr(mystring)
do Loop
einbyte = INP(adr)
if einbyte = 0 then exit do
print chr(einbyte);
incr adr
next
print
Schreiben geht ähnlich mit "OUT" (-->Help)
Vorteil: du mußt nicht alle Felder doppelt definieren
robby-fant
26.08.2006, 18:44
Leute, mancht den Jungen doch nicht verrückt mit Dingen, die ihr kaum versteht.
Erwollte ganz einfach 5Byte als eine Zahlenreihe in Word umwandeln.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.