Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Eigene Strtoint_Funktion
pigfacejoe - Do 30.11.06 18:08
Titel: Eigene Strtoint_Funktion
Hi ,
wir sollen für die Schule eine eigene Strtoint-Funktion schreiben (d.h sie sollte von string in integer umwandeln)
Falls jm ne idee hat bitte hier posten.
Moderiert von
Christian S.: Topic aus Sonstiges (Delphi) verschoben am Do 30.11.2006 um 18:36
Gausi - Do 30.11.06 18:16
Ich würde das einfach in einer Schleife ziffernweise machen.
Quelltext
1: 2: 3:
| Ergebnis := einString[1]; von i = 2 bis Länge(einString) do Ergebnis := Ergebnis * 10 + Wertvon(einString[i]) |
wobei
Quelltext
1: 2: 3: 4: 5: 6: 7:
| Funktion Wertvon(einBuchstabe): Integer; falls einBuchstabe ist '0': Ergebnis := 0; '1': Ergebnis := 1; usw.
ansonsten: Ergebnis := Fehler; |
Und das muss man jetzt nur nach Delphi übersetzen ;-)
pigfacejoe - Do 30.11.06 18:19
für deine Lösungen brauch ich aber die strtoint funktion wenn ich das richtig verstehe und ich kann ja nicht (bei deiner 2. Lösung) alle zahlen in einer Schleife durchgehen dann dauert das doch wewig bei grossen zahlen.
Ich denke eher an ord() und Chr() mit ASCI Code,weiss aber nicht wie ich das umsetzen soll
Gausi - Do 30.11.06 18:24
Die zweite Funktion berechnet nur den Wert einer Ziffer. Das "usw." geht also nur bis 9 ;-)
Aber du hast recht, dass kann man mit Ord eleganter machen. Die Funktion StrToInt brauche ich aber nicht!
Danny W. - Do 30.11.06 18:27
warum guckst du dir nicht einfach mal die richtige strtoint funktion an (oder ist es eine prozedur?^^) und baust die mehr oder weniger nach...dein Lehrer kann ja schließlich nicht von dir verlangen das du das Rad neu erfindest :)
Christian S. - Do 30.11.06 19:07
Mantis1987 hat folgendes geschrieben: |
warum guckst du dir nicht einfach mal die richtige strtoint funktion an (oder ist es eine prozedur?^^) und baust die mehr oder weniger nach...dein Lehrer kann ja schließlich nicht von dir verlangen das du das Rad neu erfindest :) |
StrToInt arbeitet über
Val und das ist IIRC Compiler-Magic ;-)
BenBE - Do 30.11.06 19:18
Christian S. hat folgendes geschrieben: |
Mantis1987 hat folgendes geschrieben: | warum guckst du dir nicht einfach mal die richtige strtoint funktion an (oder ist es eine prozedur?^^) und baust die mehr oder weniger nach...dein Lehrer kann ja schließlich nicht von dir verlangen das du das Rad neu erfindest :) | StrToInt arbeitet über Val und das ist IIRC Compiler-Magic ;-) |
Compiler-Magic hält einen nicht davon ab, zu schauen, was der Compiler übersetzt. Ein Aufruf von Trunc wird auch nur mit einem CALL von System.@Trunc übersetzt. und diese steht in System.pas als private Prozedur _Trunc im Source drin ;-) Ähnliches gilt auch für Val. Was ihn schon mehr davon abhalten könnte, ist die Tatsache, dass Val vollständig in ASM gecoded ist (selbst wenn dass immer noch kein Indiz für ihre Geschwindigkeit ist ...
Die geposteten Ansätze sind in der Form aber bereits korrekt. Fehlt nur noch die Fehlerprüfung für Überläufe ;-)
@CS: Wäre das nicht was für Algo&Opti?
Allesquarks - Do 30.11.06 21:03
Ich hoffe das mit dem pchar klappt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| function strtoint2(str:pchar):integer; asm push ebx; mov ebx,eax; xor ecx,ecx; xor eax,eax; xor edx,edx; @@loop1: mov al,byte ptr [ebx+ecx]; cmp eax,$00; jz @@ende; inc ecx; sub eax,48; cmp eax,$09; jg @@ungueltigesZeichen; imul edx,$0A; add edx,eax; jno @@loop1; @@ungueltigesZeichen: @@ende: pop ebx; mov eax,edx; end; |
Das Ding tut seinen Dienst musst nur noch das Vorzeichen selber machen und die Fehlermeldungen einbauen
Edit: WAs ist denn da mit dem Syntaxhighlighter los???
Hab das mal getestet: Das liegt an dem Ende da erkennt er wohl das end der function: TS-TS
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!