Entwickler-Ecke

Sonstiges (Delphi) - dez-hex funktions bug


sauerkraut - Do 11.11.04 15:22
Titel: dez-hex funktions bug
hier eine funktion die ich zum umwandeln von dez in hex geschrieben hab, aber manchmal schreibt die funktion vor die eigentliche zahl eine 0 ! (so wird aus 255 dez nicht ff sondern 0ff!)
woran kann das liegen?


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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
function deztohex(dez : string) : string;
var
  z : array [0..16of string;
  x : string;
  i,erg : real;
begin
z[0] := '0';
z[1] := '1';
z[2] := '2';
z[3] := '3';
z[4] := '4';
z[5] := '5';
z[6] := '6';
z[7] := '7';
z[8] := '8';
z[9] := '9';
z[10] := 'a';
z[11] := 'b';
z[12] := 'c';
z[13] := 'd';
z[14] := 'e';
z[15] := 'f';
i := 1;
erg := strtoint(dez);
  while erg>15 do begin
    erg := floor(erg/15);
    i:=i+1;
  end;
  erg := strtoint(dez);
    while i>=1 do begin
  x := x + z[floor(erg / power(16,i-1))];
  erg := erg - (floor(erg / (power(16,i-1))) *(power(16,i-1)));
  i:=i-1;
    end;
  result := x;
end;



Moderiert von user profile iconTino: Topic aus VCL (Visual Component Library) verschoben am Do 11.11.2004 um 17:01


raziel - Do 11.11.04 15:32

Nimms mir nicht übel, aber vor lauter floor und Power wird mir ganz schwummig... ;)
Hier mal mein Vorschlag, da Power imho recht langsam is, falls du fragen hast, nur her damit!

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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
function deztohex(dez : string) : string;
var
  z : array [0..16of char;
  erg : string;
  i, j: integer;
begin

z[0] := '0';
z[1] := '1';
z[2] := '2';
z[3] := '3';
z[4] := '4';
z[5] := '5';
z[6] := '6';
z[7] := '7';
z[8] := '8';
z[9] := '9';
z[10] := 'a';
z[11] := 'b';
z[12] := 'c';
z[13] := 'd';
z[14] := 'e';
z[15] := 'f';

erg := '';
i := strtointdef(dez, 0);
while  i > 0 do
begin
  j := i mod 16;
  i := i div 16;
  erg := z[j] + erg;
end;

result := erg;
end;


so völlig ohne gleitkommas und unnötige math funktionen ;)
sicher noch weiter optimierbar, aber das fiele unter optimierung und assembler.

raziel


sauerkraut - Do 11.11.04 15:41

das ist in der tat kürzer..was heisst den div und mod? und strtointdef?

ok habs nachgesehen...is klar


raziel - Do 11.11.04 15:51

Also:

div: Ganzzahlige Division
z.B.: 5 div 3 ist 1, 13 div 4 ist 3, etc. Also eine ganz normale Division, bloß wird der Nachkommateil abgeschnitten.

mod: Modulo, der Rest von einer Division
z.B. 5 mod 3 ist 2 (5:3=1 Rest 2) 13 mod 4 ist 1 (13:4=3 Rest 1) und 25 mod 5=0 (25:5=5 Rest 0)

StrToIntDef ist im Prinzip das Gleiche wie StrToInt, nur falls der übergebene String kein güliger Integer ist, gibt die Funktion den zweiten Parameter zurück.

raziel