Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zahl in einzelne Stellen zerlegen ohne Stringkonvertierung! (https://www.delphipraxis.net/133112-zahl-einzelne-stellen-zerlegen-ohne-stringkonvertierung.html)

alzaimar 26. Apr 2009 14:10

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru
 
Zitat:

Zitat von Amateurprofi
@alzaimar:
In der letzten Zeile von NumberToDigits sollte es wohl besser heißen
Delphi-Quellcode:
SetLength (Result, n);

Ich dachte dabei an den Fall: aNumber = 0. Aber das ist sowieso nicht ganz korrekt. Es müsste eine Repeat-Until Schleife sein. Und dann hättest Du Recht.
Delphi-Quellcode:
Function NumberToDigits (aNumber : Cardinal) : TByteArray;
Var
  n : Integer;

Begin
  n := 0;
  SetLength (Result, 10);
  Repeat
    Result[n] := aNumber mod 10;
    aNumber := aNumber div 10;
    Inc (n);
  Until aNumber = 0;
  SetLength (Result, n1);
End;
..
// Beispiel
Var
  B : TByteArray;

Begin
  B := NumberToDigits (1234); // --> B = (4,3,2,1), also B[0] = 4, B[1] = 3 usw
  ...
@himitsu: Findst Du Assembler hier wirklich angebracht?

himitsu 26. Apr 2009 14:53

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru
 
na OK, die paar Microsekunden machen es dann wohl auch nimmer aus :angel2:
aber im Grunde hätt ich das Ganze dann noch über 'nen statisches Array gemacht.

Zitat:

Ich dachte dabei an den Fall: aNumber = 0. Aber das ist sowieso nicht ganz korrekt.
dann hättest du bei aNumber = 0 auch nichts richtiges ... da dort zwar ein Wert im Array drinstünde,
bei aNumber > 0 immer ein Fehld mehr existieren würde
und der letzte Wert im Array undeffiniert wär :shock:


Na ok, im Prinzip machen unsere Functionen (deine Letzte und Meine) das Selbe (außer einer Divisions-Operation und noch ein paar Sachen bezüglich der Array-Verwaltung weniger)

ja und wie gesagt ... Types.TByteDynArray :zwinker:
Delphi-Quellcode:
Function NumberToDigits(aNumber: Cardinal): TByteDynArray;
Var n: Integer;
Begin
  n := 0;
  SetLength(Result, 10);
  Repeat
    Result[n] := aNumber mod 10;
    aNumber := aNumber div 10;
    Inc(n);
  Until aNumber = 0;
  SetLength(Result, n);
End;

EWeiss 26. Apr 2009 16:58

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru
 
OT:

Alle Achtung es gibt Leute hier die haben Mathematisch echt was drauf.
:thumb:
Muss mal gesagt werden.

gruss Emil

richard_boderich 26. Apr 2009 18:15

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru
 
Also der Algorithmus funktioniert nicht korrekt. Die letzte Stelle wird unterschlagen. :(
Habe jetzt den neuesten von himitsu getestet.

himitsu 26. Apr 2009 18:20

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru
 
also bei mir laufen beide Varianten? :gruebel:

also das mir ASM
und der der letze Code (wobei der nur des Code von alzaimar #11 ist, nur ohne die Fehler bezüglich dem n1 und des TByteArray)

mirage228 26. Apr 2009 19:05

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru
 
Ich würde sonst noch die Verwendung der Funktion Delphi-Referenz durchsuchenDivMod aus der Unit Delphi-Referenz durchsuchenMath vorschlagen. Sie verwendet zwar kein IDIV könnte aber ggf. schneller sein, als zwei gesonderte Aufrufe an DIV und MOD...

himitsu 26. Apr 2009 19:48

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru
 
DivMod arbeitet nur mit Word und nicht mit Integer

mirage228 26. Apr 2009 19:54

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru
 
Zitat:

Zitat von himitsu
DivMod arbeitet nur mit Word und nicht mit Integer

Hm, stimmt. Das also dazu :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:56 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz