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.
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
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.
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:
Ist zwar etwas an Deinem Ziel vorbei aberCode: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
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.
Code: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
Gruss
Darwin (meine Projekte sind auf meiner Pinnwand zu finden)
.....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
Das wäre dann etweder ein String oder du musst jede einzelne Zahl potenzierenZitat von robby-fant
Beispiel 9876
also
9 * 1000 = 9E3 = 9*10^3
8 * 100 = 8E2 = 8*10^2
7 * 10 = 7E1 = 7*10^1
6 * 1
'Code: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.
Gruss
Darwin (meine Projekte sind auf meiner Pinnwand zu finden)
davon reden wir doch die ganze Zeit, du machst es zu kompliziert.
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:
Im LCD steht nachher auch Test in der oberen Zeile.Code:$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
Dadrunter steht nur Müll. Was mache ich falsch ??
Daniel
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.
Gruss
Darwin (meine Projekte sind auf meiner Pinnwand zu finden)
Lesezeichen