AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Float Zahlen in Hex Zahlen umwandeln
Thema durchsuchen
Ansicht
Themen-Optionen

Float Zahlen in Hex Zahlen umwandeln

Offene Frage von "danielA"
Ein Thema von satfer · begonnen am 5. Dez 2013 · letzter Beitrag vom 6. Dez 2013
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.540 Beiträge
 
Delphi 12 Athens
 
#1

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 18:17
Records mit varianten Teilen entspricht quasi dem Absolute.
Nur daß beim Absolute keinerlei Prüfungen vom Compiler vorgenommen werden. (beim Record werden gemanagete Typen "verboten")

Ob man nun den Record nimmer und die Daten erst reinkopiert, um sie dann "gecastet" da auszulesen oder ob man den Typ direkt zum Casten nimmt, ist geschmackssache, wobei der direkte Weg sich die zusätzliche Kopieroperation erspart.

Man kann sich auch gern eine generische Funktion schreiben, welche die eine Variable als Parameter annimmt und das im anderen Format ausgibt.
Entspricht dann einem "expliziten" Cast, welchen man sich via Record-Operatoren basteln kann.

Und dann gibt es noch den Weg über einen Record-Helper, wo man sich eine Konvertierungsfunktion basteln kann, wie z.B. das .ToString an Klassen und neuerdings auch an einigen generischen Typen wie z.B. den Integern.


Oder man geht den klassischen Weg und nutzt eine Konvertierungsprozedur mit In-Param und Out/Var-Param, oder das Out als Result.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 5. Dez 2013 um 18:24 Uhr)
  Mit Zitat antworten Zitat
danielA

Registriert seit: 10. Jun 2002
Ort: Hamburg
72 Beiträge
 
Delphi 12 Athens
 
#2

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 19:06
Hättest du vielleicht mal ein Beispiel oder einen Link zu der Absolute Methode?
Diese direktive kenne ich überhaupt nicht und wird in der Delphi- Hilfe von XE2 auch nur in einer Tabelle als direktive erwähnt aber mit keinem Wort erklärt.
Eine Möglichkeit gäbe es zur eigentlichen Aufgabe aber nocht. Aus Faulheit hätte ich diese sicher auch gewählt

Code:

var SingleVar : Single;
    Intvar : integer;
begin
  SingleVar := 1.1234;
  move(SingleVar, IntVar, 4);
  showmessage(IntToHex(IntVar));
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.540 Beiträge
 
Delphi 12 Athens
 
#3

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 20:27
Delphi-Quellcode:
var
  SingleVar: Single;
  IntVar: Integer absolute SingleVar;
begin
  SingleVar := 1.1234;
  ShowMessage(IntToHex(IntVar));
end;
Es besagt einfach nur, daß diese Variable an der selben "absoluten" Adresse beginnen soll, wie die angegebene andere Variable.

Aber ein Cast ist da eh besser/einfacher, vorallem da der Compiler einem bescheid gibt, wenn der Cast nicht "möglich" ist, z.B. aufgrund der Typen oder Speichergröße.
Delphi-Quellcode:
var
  SingleVar: Single;
begin
  SingleVar := 1.1234;
  ShowMessage(IntToHex(Integer(SingleVar)));
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 5. Dez 2013 um 20:30 Uhr)
  Mit Zitat antworten Zitat
danielA

Registriert seit: 10. Jun 2002
Ort: Hamburg
72 Beiträge
 
Delphi 12 Athens
 
#4

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 6. Dez 2013, 09:07
Hallo Himitsu,

vielen Dank für das Beispiel.

Die Sache mit Absolute scheint wirklich sehr interessant zu sein. Das werde ich mir merken.

Beim zweiten Beispiel...
Nun ja ich finde es trotzdem Merkwürdig, dass der Compiler da meckert. Belegen doch beide Werte gleich viel Speicher. Vermutlich konnte man sich nicht einigen ob man bei diesem Cast nur den Ganzzahligen Wert oder den binär betrachteten Wert des belegten Speichers zurückgibt.
Eine Möglichkeit diesen Cast trotzdem auszuführen währe dann aber noch folgende:

Code:

var
  SingleVar: Single;
begin
  SingleVar := 1.1234;
  ShowMessage(IntToHex(Integer(Pointer(SingleVar)),8));
end;
Dabei geht aber leider wieder die Typüberprüfung verloren. Da SingleVar von jedem Typ sein könnte.
Mir persönlich gefällt dann Deine Variante mit Absolute doch besser, wenn keine Bytevertauschungen (Big <-> Little Endian) durgeführt werden müssen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.540 Beiträge
 
Delphi 12 Athens
 
#5

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 6. Dez 2013, 10:08
Es kann sein, daß der Compiler dort eine Typprüfung in der Konvertierung vornimmt. Macht die Compilermagic bei einigen Typen.
Wie z.B. auch zwischen ANSI- und UnicodeStrings, wobei dort nur eine Warnung angezeigt wird, daß man da auspassen sollte.

Man kann auch ganz "böse" sein und sämtliche Prüfungen umgegehn.
Delphi-Quellcode:
var
  SingleVar: Single;
begin
  SingleVar := 1.1234;
  ShowMessage(IntToHex(PInteger(@SingleVar)^, 8));
end;
Aber genauso, wie beim Absolute, sollte man beim wilden Rumgepointere unbedingt aufpassen, was man macht und möglichst auch verstehn warum man es so macht.

PS: [DELPHI]...[/DELPHI]
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 6. Dez 2013, 10:45
Mir persönlich gefällt dann Deine Variante mit Absolute doch besser, wenn keine Bytevertauschungen (Big <-> Little Endian) durgeführt werden müssen.
Vorsicht! bei Variablendeklarationen mit Absolute hast Du zwei Variablen, die den gleichen Inhalt haben, wenn Du das "unterwegs" vergisst, kannst Du durchaus ungewollte Effekte erreichen.
Und im Übrigen gilt natürlich
Zitat:
Aber genauso, wie beim Absolute, sollte man beim wilden Rumgepointere unbedingt aufpassen, was man macht und möglichst auch verstehn warum man es so macht.
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
danielA

Registriert seit: 10. Jun 2002
Ort: Hamburg
72 Beiträge
 
Delphi 12 Athens
 
#7

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 6. Dez 2013, 11:49
Zitat:
Vorsicht! bei Variablendeklarationen mit Absolute hast Du zwei Variablen, die den gleichen Inhalt haben, wenn Du das "unterwegs" vergisst, kannst Du durchaus ungewollte Effekte erreichen.
Ne ne dass beide Variablen den selben Speicher referenzieren und das nur benutzt werden sollte, wenn man weiß was man tut ist schon klar.

Ja und das Thema Strings ist ja mittlerweile wirklich zu einer Wissenschaft für sich geworden. Ich selbst bin gerade am Umstieg von Delphi6 auf die XE2 dabei und habe noch einige 100000 Zeilen Quellcode zu konvertieren. Im allgemeinen macht Delphi das ja alles von alleine aber gerade Low Level programmierte Sachen, in denen mit String bzw. PChar gearbeitet wurde, ist doch einiges an eingriffen notwendig.

Wenn ich das richtig verstanden habe ist der Typ AnsiString in erster Linie für SingleByte Zeichensätze gedacht. Unterstützt aber auch Multibyte, während UnicodeStrings von Vorneherein als Multibytezeichensatz angenommen werden kann. Wobei UnicodeStrings auch AnsiStrings enthalten können. Eine Warnung scheint mir deshalb doch auch ziemlich Sinnvoll.

Aber ich glaube ich werde jetzt Off Topic ...
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz