Was genau tut dieser Code?

Anfängerfragen zum Programmieren mit PureBasic.
mikes1
Beiträge: 2
Registriert: 30.03.2013 17:37

Was genau tut dieser Code?

Beitrag von mikes1 »

Liebe Purebasic-Profis,

ich komme mit der unten stehenden Syntax nicht so ganz klar, vielleicht könnt
ihr mir ja erklären, was genau dieser tut, es ging ursprünglich eigentlich mal um eine
Umrechnung einer Hex-Zahl, was aber nicht richtig funktioniert hat. Dadurch
wurde eine falsche Zahl für die ursprüngliche Hexzahl gespeichert und mich würde
nun interessieren, wie diese Umrechnung unten funktioniert und vielleicht auch wo
der Fehler liegt:

Code: Alles auswählen

For i = 1 To Len(a$) 
          d = (d << 4) + Asc(UCase(Mid(a$,i,1)))-48 - 7 * (Asc(UCase(Mid(a$,i,1)))>>6) 
Next
Vielen Dank im voraus und Grüsse
mikes1

__________________________________________________
Code-Tags hinzugefügt
30.03.2013
RSBasic
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Was genau tut dieser Code?

Beitrag von 7x7 »

Der Code funktioniert so wie er soll. Du musst nur die Variable 'd' wieder auf null setzen, wenn eine andere Hexzahl konvertiert werden soll

z.B:

Code: Alles auswählen

For a=0 To 255
	a$=Hex(a)
	
   ;----------	
	d=0
	For i = 1 To Len(a$)
		d = (d << 4) + Asc(UCase(Mid(a$,i,1)))-48 - 7 * (Asc(UCase(Mid(a$,i,1)))>>6)
	Next
	Debug d
   ;----------

Next a
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: Was genau tut dieser Code?

Beitrag von Kevin »

mikes1 hat geschrieben:Liebe Purebasic-Profis,

ich komme mit der unten stehenden Syntax nicht so ganz klar, vielleicht könnt
ihr mir ja erklären, was genau dieser tut, es ging ursprünglich eigentlich mal um eine
Umrechnung einer Hex-Zahl, was aber nicht richtig funktioniert hat. Dadurch
wurde eine falsche Zahl für die ursprüngliche Hexzahl gespeichert und mich würde
nun interessieren, wie diese Umrechnung unten funktioniert und vielleicht auch wo
der Fehler liegt:

Code: Alles auswählen

For i = 1 To Len(a$) 
          d = (d << 4) + Asc(UCase(Mid(a$,i,1)))-48 - 7 * (Asc(UCase(Mid(a$,i,1)))>>6) 
Next
Vielen Dank im voraus und Grüsse
mikes1
Hi,
mit negativen zahlen hat es nicht funktioniert und du musst d immer auf 0 setzen

Code: Alles auswählen

Procedure ValHex(hex$)
  Protected d=0,len,i,char,neg
  
  If Left(hex$,1)="-"
    hex$=Mid(hex$,2)
    neg=1
  Else
    neg=0
  EndIf
  
  len=Len(hex$)
  For i = 1 To len
    char=Asc(UCase(Mid(hex$,i,1)))
    d = (d << 4) + char-48 - 7 * (char>>6)
  Next
  
  If neg
    ProcedureReturn -d
  Else
    ProcedureReturn d
  EndIf
EndProcedure

Debug ValHex("fffffff")
Debug   Val("$fffffff")

Debug ValHex("abcdef")
Debug   Val("$abcdef")

Debug ValHex("-23450")
Debug   Val("-$23450")

Debug ValHex("-1000")
Debug   Val("-$1000")

Debug ValHex("-fffffff")
Debug   Val("-$fffffff")
mfg
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Was genau tut dieser Code?

Beitrag von 7x7 »

@Mikes1
Sorry, eigentlich wolltest du ja wissen, wie der Code FUNKTIONIERT.

"d<<4" multipliziert das bisherige Ergebnis mit 16 (bei mehrstelligen Hexzahlen)

"Asc(UCase(Mid(a$,i,1)))-48" ergibt als Ergebnis eine Zahl zwischen 0 bis 22 ("0"=ASCII 48, "F"=ASCII 70)

"-7* (Asc(UCase(Mid(a$,i,1)))>>6)" ergibt -7, wenn das Zeichen "A....F" war, ansonsten 0 bei den Zeichen "0...9"
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
mikes1
Beiträge: 2
Registriert: 30.03.2013 17:37

Re: Was genau tut dieser Code?

Beitrag von mikes1 »

Super vielen Dank an Euch - ja auch die Art der Umrechnung war wichtig für mich.

Vielen Dank nochmal !
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Was genau tut dieser Code?

Beitrag von 7x7 »

Nebenbei bemerkt: Der Code ist von der Logik her nicht schlecht! Hab schon andere Sachen gesehen...
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
mirca
Beiträge: 169
Registriert: 13.11.2011 16:05

GELÖSCHT

Beitrag von mirca »

GELÖSCHT
Zuletzt geändert von mirca am 17.10.2013 11:47, insgesamt 1-mal geändert.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Was genau tut dieser Code?

Beitrag von 7x7 »

mirca hat geschrieben:Ist es nicht sinnvoller
wenn man die Länge vorher in eine Variable
speichert und diese nach To einfügt?
Auch Mid() wird unnötig zweimal verwendet.
Hast natürlich Recht, aber selbst bei einer 4-stelligen Hexzahl sollte die CPU dabei nicht ins Schwitzen kommen :mrgreen:

Und falls doch, kann man ja immer noch einfach die ganze Schleife durch d=Val("$"+a$) ersetzen <)
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Antworten