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! :D
Viel Spaß damit.

Re: Geschwindigkeit

Verfasst: 11.12.2012 18:09
von 7x7
Ist zwar etwas overkill, aber jetzt habe ich endlich alles kapiert :D

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 :mrgreen:

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