Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - type cast ?
buSC - Di 16.02.10 17:44
Titel: type cast ?
hallo
eine kleine Frage: wie kann ich ein double variable in ein Integer speichern?
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| i:integer; d:double; begin d:=7; i:=integer(d); end |
vielen Dank im Voraus. :)
Moderiert von
Narses: Delphi-Tags hinzugefügt
Jakob_Ullmann - Di 16.02.10 17:49
Funktionen wie Trunc(), Round(), Floor(), Ceil() sind da hilfreich.
Trunc() = Dezimalstellen abschneiden
Round() = runden, Details in OH
Floor() = abrunden
Ceil() = aufrunden
buSC - Mi 17.02.10 07:39
ja vielen Dank an Jakob fuer die Antwort,
aber meinst du ,dass es mit dem "type cast" nicht geht ?
Danke nochmal :)
jasocul - Mi 17.02.10 08:47
Mancher TypeCast ist einfach Unsinn. Einen Float ind einen Integer zu casten gehört dazu.
Woher soll der Compiler wissen, welchen Inhalt dein Double zur Laufzeit hat? Da können dann auch Nachkommastellen enthalten sein. Was soll dann beim Casten passieren? Runden? Abschneiden?
Darum gibt es die entsprechenden Funktionen, die die Umwandlung machen.
Xentar - Mi 17.02.10 09:44
Außerdem ist ein double doch 64 Bit, ein Integer jedoch nur 32 ?
Gammatester - Mi 17.02.10 10:10
jasocul hat folgendes geschrieben : |
Mancher TypeCast ist einfach Unsinn. Einen Float ind einen Integer zu casten gehört dazu. |
In dieser Allgemeinheit ist eher Deine Aussage unsinnig bzw. falsch. Integer-Typecasts via Pointer oder Integer-Array- bzw. Record-Typecasts auf Fließkommavariable werden zB benutzt, um den Wert zu klassifizieren (IsNaN, IsInf etc., sieh Dir mal den RTL-Source an!) Oder: Versuch mal ohne diese Typecasts herauszufinden, ob eine Extended-Variable Pseudo-Denormals oder Unnormals enthält. Oder beleg mal eine Single-Variable mit dem nächstgrößeren Wert, oder ...
Gruß Gammatester
jasocul - Mi 17.02.10 13:23
@
Gammatester:
Hier geht es doch nicht im TypeCasts via Pointer, Arrays oder andere "Tricks". Ebensowenig deutet hier irgendwas auf tiefgreifende mathematische Funktionen oder Probleme hin.
Die von dir angegebenen Bereiche sind sehr speziell und finden in der "üblichen" Anwendungsentwicklung kaum eine Nutzung. Somit ist meine Aussage ganz allgemein betrachtet schon richtig. In speziellen Bereichen hast Du aber Recht. Aber auf die war die ursprüngliche Frage offensichtlich nicht ausgerichtet.
buSC - Do 18.02.10 13:18
HALLO
danke an alle ,fuer eure Antworte
wie ich verstanden habe ,ein Typecast von double nach integer geht nicht.
aber jetzt andere Frage ,ist es ein typeCast von integer nach double moeglich,genauer gesagt
habe ich folgendes Problem:
gibts es ein Trick,mit dem man ein Integer-Array in einem doubleArray mit hilfe von
"copy" function kopieren kann?
intArr:array of integer;
dblArr:array of double;
ich will jetzt intArr in form von einem double-Array haben,wobei es wenig Aufwand bringt.
gibts es ein Trick dafuer oder ?
ich hab folgendes probiert aber bekomme ich der Nachricht:"incompatible types"
dblArr:=copy(intArr);
vielen Dank im voraus
:)
Jakob_Ullmann - Do 18.02.10 13:30
Nein, das gibt es soweit ich weiß nicht. Das wirst du wohl selber machen müssen, aber du könntest dir eine Funktion dafür schreiben, die das macht. Ansonsten könnte das so gehen:
Delphi-Quelltext
1: 2: 3:
| for i := 0 to Length(dblArr) - 1 do intArr[i] := Trunc(dblArr[i]); |
zu Copy: Copy kopiert Zeichen eines Strings, zum Beispiel
Delphi-Quelltext
1: 2:
| s := 'String Example'; _s := Copy(s, 2, 5); |
Aya - Do 18.02.10 14:39
Nur mal aus neugierde... ich habe kein Delphi mehr zur hand und kann daher nicht selbst nachschauen.. aber, wie schaut denn der source von z.B. Trunc() aus?
Ich meine, irgendwann muß ja der Double in ein Integer gecastet werden, also muß es irgendwo in der Trunc-funktion einen typecast geben.
guinnes - Do 18.02.10 14:43
Aya hat folgendes geschrieben : |
Ich meine, irgendwann muß ja der Double in ein Integer gecastet werden, also muß es irgendwo in der Trunc-funktion einen typecast geben. |
Ne, das läuft über den Co und wird nicht gecastet sondern umgerechnet
Aya - Do 18.02.10 14:44
guinnes hat folgendes geschrieben : |
Aya hat folgendes geschrieben : | Ich meine, irgendwann muß ja der Double in ein Integer gecastet werden, also muß es irgendwo in der Trunc-funktion einen typecast geben. | Ne, das läuft über den Co und wird nicht gecastet sondern umgerechnet |
Und wie wird es umgerechnet?
Zeig mal bitte den source vom Trunc()
guinnes - Do 18.02.10 14:51
SUB ESP,12
FSTCW [ESP]
FWAIT
FLDCW cwChop
FISTP qword ptr [ESP+4]
FWAIT
FLDCW [ESP]
POP ECX
POP EAX
POP EDX
Zeilen 1994 bis 2003 in System.Pas bei Delphi 5
Aya - Do 18.02.10 14:55
Okay, überredet.. dann gibt es eben echt keinen solchen type-cast in Delphi.. :)
PS: Hab aber ja immerhin auch seit gut 3-4 Jahren kein Delphi mehr angerührt.. da vergisst man einiges ^^
guinnes - Do 18.02.10 15:29
Es kann keinen TypeCast geben zwischen Gleitkommazahlen und Integern, der Aufbau ist total andern :
Kannst du mir sagen, was diese DoubleZahl als Integer ist : 4002c3fe5c91d14e ?
Gammatester - Do 18.02.10 17:03
guinnes hat folgendes geschrieben : |
Es kann keinen TypeCast geben zwischen Gleitkommazahlen und Integern, der Aufbau ist total andern :
Kannst du mir sagen, was diese DoubleZahl als Integer ist : 4002c3fe5c91d14e ? |
Da Dein double den Wert 2.345 hat, wären zwei sinnvolle Antworten:
a) 2
b) $4002c3fe5c91d14e
Hier werden leider die ganze Zeit Wert- und Variablen-Typecasts mit einander vermengt (engl. Onlinehilfe: Value typecasts bzw.Variable typecasts).
Beide sind hier allerdings nicht möglich. a) Weil ein double kein Ordinalwert ist, b) weil sizeof(double) <> sizeof(integer).
Gammatester
PS: In BP7 ist zB ein Variablen Typecast single -> longint möglich. Warum Delphi rumzickt ist nicht klar: Delphi 2 macht's zB noch, ebenso wie FreePascal 2.4)
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!