Seite 5 von 7
Re: Geschwindigkeit
Verfasst: 11.12.2012 18:03
von NicTheQuick
7x7 hat geschrieben:NicTheQuick hat geschrieben:...kann ich meinen Code gerne noch für dich kommentieren. Also?
Gerne!

Viel Spaß damit.
Re: Geschwindigkeit
Verfasst: 11.12.2012 18:09
von 7x7
Ist zwar etwas overkill, aber jetzt habe ich endlich alles kapiert

Re: Geschwindigkeit
Verfasst: 11.12.2012 18:26
von NicTheQuick
Mir fällt's da auch eh immer schwer den richtigen Punkt zwischen grober und detaillierter Erklärung zu finden.
Re: Geschwindigkeit
Verfasst: 11.12.2012 18:41
von bobobo
Blindfischfütterung
Wer Code nicht lesen kann oder will, will Code nicht lesen oder kann es nicht.
außerdem fehlt ein '-1,#PB_Ascii)' in Nics Code
Re: Geschwindigkeit
Verfasst: 11.12.2012 19:13
von lite
Hallo
Hab den Code für ungerade Stringfolgen optimiert.
Code: Alles auswählen
String$ = "78DAA5975758135A97862345A922BD0A28BD86167A111040"
String$ = "78d"
datalen = Len(String$)
If datalen =0: End: EndIf
datalen=Round(datalen / 2,#PB_Round_Nearest)
*memdata = AllocateMemory(datalen)
Define v.i, *c.Character, *m.Ascii
*c.Character = @String$
*m.Ascii = *memdata
While *c\c
*m\a = *c\c - '0' ; unteres Nibbel ; Zahl umrechnen
If *c\c >= 'A': *m\a = *c\c - 'A' + 10: EndIf ; Buchstabe umrechnen
*c + SizeOf(Character)
If *c\c = 0
*m\a &15 ; bei ungerade , Reste von oberes Nibbel löschen
Break ; schleife beenden
EndIf
*m\a << 4 ; unteres Nibbel nach oben verschieben
v = *c\c - '0' ; Zahl umrechnen
If *c\c >= 'A': v = *c\c - 'A' + 10: EndIf ; Buchstabe umrechnen
*m\a + v ; oberes und unteres Nibbel addieren
*c + SizeOf(Character) ; quell Pointer erhöhen
*m + SizeOf(Ascii) ; Ziel Pointer erhöhen
Wend
ShowMemoryViewer(*memdata,datalen)
Grüße
Lite
Re: Geschwindigkeit
Verfasst: 11.12.2012 19:35
von _JON_
Lite, dein Code hat aber ein Problem:
Es gibt von demn String "78d" die Bytes 78 0D zurück.
Richtig wäre eigentlich 07 8D.
Wenn eine ungerade Springlänge hast füge doch einfach vorne ein "0" an, bevor du es konvertierst.
Re: Geschwindigkeit
Verfasst: 11.12.2012 19:48
von lite
@_jon_
Bin nicht ganz deiner Meinung.
Die Schreibweise erfolgt paarweise von Links.
z.B. 78d = 78 d
Im Speicher sollte dann stehen "78 0d".
Lite
Re: Geschwindigkeit
Verfasst: 12.12.2012 17:58
von NicTheQuick
Das eigentliche Problem ist, dass mein Code nur funktioniert, wenn die Buchstaben im Hex-String groß geschrieben werden. Bei Kleinbuchstaben wie dem d wird falsch umgerechnet, da d den ASCII-Wert 100 hat, dann der ASCII-Code von A abgezogen wird, das wäre dann 100 - 65 = 35 und dann 10 addiert wird, womit wir 45 erhalten statt dem eigentlichen Wert 13.
Und wegen dem anderen Problem, fände ich es schlauer aus einem ungeraden String mit dem Inhalt 78D dann 78 D0 zu machen, oder?
Re: Geschwindigkeit
Verfasst: 12.12.2012 18:22
von _JON_
lite hat geschrieben:@_jon_
Bin nicht ganz deiner Meinung.
Die Schreibweise erfolgt paarweise von Links.
z.B. 78d = 78 d
Im Speicher sollte dann stehen "78 0d".
Nun gut sind deine Daten/Werte und du wirst schon wissen wie du sie interpretierst.
Aber das "78 0d" finde ich dann wiederum auch komisch,
wäre dann nicht (wie NicTheQuick meint) "78 D0" das richtige Ergebnis?
Wie auch immer persönlich würde ich im Fall eines ungeraden Strings hier einen Datenfehler melden und das nicht einfach ignorieren.
Re: Geschwindigkeit
Verfasst: 11.03.2013 06:45
von lite
Hallo
Hätte wieder ein kleines Problem mit der Geschwindigkeit.
Meine Aufgabenstellung ist, ich möchte Strings zu einem String zusammen zu fügen.
Beispiel in PB:
Code: Alles auswählen
#Size = 50000
a$=""
Time = ElapsedMilliseconds()
For n = 1 To #Size
a$+"w"
Next
Time1 = ElapsedMilliseconds()-Time
MessageRequester(Str(time1),a$)
Dieses Beispiel in PureBasic benötigt 13000 ms.
Das Beispiel in Au3:
Code: Alles auswählen
$begin = TimerInit()
$a=""
$size= 50000
for $n=1 to $size
$a=$a&"w"
next
$dif = TimerDiff($begin)
MsgBox(0,"Time Difference",$dif&@crlf&$a)
In Au3 benötigt dieses Beispiel 845 ms.
Gibt es eine Lösung diese Stringverwaltung schneller zu machen ?
Dim a$(50000) nützt mir nichts, die Strings die hinzugefügt werden sind in der Größe variabel.
Lite