Entwickler-Ecke

Algorithmen, Optimierung und Assembler - int-Variable to hex !?


bavci - Fr 18.03.05 20:43
Titel: int-Variable to hex !?
ich habe eine Variable j, deren Wert als Integer vorliegt. Jetzt möchte ich sie in das Hex-Format konvertieren, aber mit inttohex habe ich probleme. Dort muss ich ja nen speziellen Wert angeben, aber ich will/muss das irgendwie als "j" unterbringen !?


delfiphan - Fr 18.03.05 20:48

:welcome:
Probier mal inttohex(j,8).


raziel - Fr 18.03.05 20:48

Hallo und :welcome: im DF,

könntest Du Deine Frage ein bisschen präzisieren? Du willst ein Integer j Hexadezimal darstellen lassen:  Label1.Caption := IntToHex(j, 8);

Wo genau liegt jetzt das Problem?

Gruß,
raziel


Popov - Fr 18.03.05 21:14

IntToHex benötigt zwei Parameter. Der erste ist der Wert. In deinem Fall wäre das die Variable J. Der zweite Parameter sagt aus wie lang der String werden soll, denn IntToHex konvertiert den Wert in einen String.

Wenn du den Wert 255 mit 2 Stellen konvertierst, ...


Delphi-Quelltext
1:
IntToHex(2552);                    


dann kriegst du diesen Wert:


Delphi-Quelltext
1:
FF                    


Wenn du den Wert 255 mit 4 Stellen konvertierst, ...


Delphi-Quelltext
1:
IntToHex(2554);                    


dann kriegst du diesen Wert:


Delphi-Quelltext
1:
00FF                    


bavci - Fr 18.03.05 21:14

das Problem liegt darin, dass genau das nicht geht. Wenn ich anstelle j eine Zahl einsetze, dann geht es. Aber da j jedesmal nen anderen Wert hat, darf ich dort keinen festen Wert hinschreiben...........

Bekomme beim compilen den Fehler:
"Es gibt keine überladene Version von 'IntToHex', die man mit diesen Argumenten aufrufen kann".

Bin noch Anfänger, habe erst heute mit Delphi angefangen. Bin aber schon weit gekommen für den ersten Tag. Habe davor mehr mit C probiert...........


delfiphan - Fr 18.03.05 21:18

Poste doch mal einige Zeilen deines Quellcodes, dann werden wir das Problem sicher bald finden.


bavci - Fr 18.03.05 21:30

es handelt sich um ne Uhrzeitumrechnung, für ein bestimmtes Gerät (Hex-Uhrzeit => Normale Uhrzeit funktioniert. Nur für das umgekehrt habe ich das genannte problem):


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:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Hextime: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    h: TEdit;
    Label3: TLabel;
    min: TEdit;
    Label4: TLabel;
    sek: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

var
a,k: String;
b: integer;
c,d,e,f,g,i,j: real;

procedure TForm1.Button1Click(Sender: TObject);
begin
a:=Hextime.text;
b:=strtoint('$'+a);
c:=b*2/3600 - b*2 mod 3600/3600;
d:=b*2 mod 3600 / 60 - b*2 mod 3600 mod 60 /60;
e:=b*2 mod 3600 mod 60;
h.text:=floattostr(c);
min.text:=floattostr(d);
sek.text:=floattostr(e);

end;


procedure TForm1.Button2Click(Sender: TObject);
begin
f:=(strtoint(h.text))*3600;
g:=(strtoint(min.text))*60;
i:=(strtoint(sek.text));
j:=(f+g+i)/2;
k:=intToHex(j,8);

end;

end.


Moderiert von user profile iconUGrohne: Code- durch Delphi-Tags ersetzt.


bavci - Fr 18.03.05 21:31

Das Problem liegt in der 2.ten funktion (Button2)..........


delfiphan - Fr 18.03.05 21:32

:arrow: j ist bei dir kein Integer, sondern ein real. Das ist ne Gleitkommazahl, die du vor dem Konvertieren runden musst.


bavci - Fr 18.03.05 21:37

und wie runde ich die !? Denn die Zahl hat nie kommastellen..............


delfiphan - Fr 18.03.05 21:38

Mit Round(j)


bavci - Fr 18.03.05 21:40

dann erhalte ich die vorhin gennante fehlermeldung und noch eine mehr:
"Anweisung erforderlich, aber Ausdruck vom Typ 'Int64' gefunden"


delfiphan - Fr 18.03.05 21:43


Delphi-Quelltext
1:
k := IntToHex(Round(j),8);                    


bavci - Fr 18.03.05 21:46

Danke, es klappt endlich :D
Aber ich verstehe nicht warum ich den Wert runden musste !? Die Zahle hatte keine stelle hinter'm komma.............


delfiphan - Fr 18.03.05 21:57

Delphi hat eine strenge Typenprüfung (abgesehen von Variant). Delphi konvertiert nicht automatisch von real zu integer (umgekehrt aber schon).
user profile iconbavci hat folgendes geschrieben:
Die Zahle hatte keine stelle hinter'm komma.............

Woher sollte dein Programm denn das wissen? j ist eine Gleitkommazahl und könnte Nachkommastellen haben!


Harry Hunt - Fr 18.03.05 22:28

Die strenge Typisierung von Delphi verhindert viele Leichtsinnsfehler bevor sie entstehen. Dabei ist Delphi sogar noch recht tolerant - in Programmiersprachen wie Ada kann man zu einer Real-Variable ohne vorherige Konvertierung z.B. noch nicht einmal einen Integerwert dazuaddieren.


Popov - Fr 18.03.05 22:35

Du hättest auch so programmieren können:


Delphi-Quelltext
1:
2:
j:=(f+g+i) div 2;  
k:=intToHex(j,8);


f, g und i waren bereits Integer. Erst das Dividieren durch 2 machte das ganze zu Real. Mit einem Integer DIV würde die Berechnung ein Integer bleiben.