Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Integer/Extended inkompatible (https://www.delphipraxis.net/206371-integer-extended-inkompatible.html)

Nikodel 15. Dez 2020 10:21

Delphi-Version: 5

Integer/Extended inkompatible
 
hallo,

folgende Zeile ergibt den Compilierfehler "inkompatible Typen 'Integer' und 'Extended'":
Code:
var
  Beschr: String;
  nBl, I: Integer; // Anzahl Blanks
begin
  ...
  nBl := StrToInt(BreiteNamen.Text)/2-2;
Welche '2' ist denn hier Extended?

Nikodel

mkinzler 15. Dez 2020 10:26

AW: Integer/Extended inkompatible
 
Eine halbe Ganzzahl ist ein Extendend

Delphi-Quellcode:
nBl := Trunc(StrToInt(BreiteNamen.Text)/2)-2;
oder Round

haentschman 15. Dez 2020 10:27

AW: Integer/Extended inkompatible
 
Hallöle...:wink:

das / ergibt immer Nachkommastellen. Und dann ist es ein Extended. :zwinker:

Nikodel 15. Dez 2020 10:35

AW: Integer/Extended inkompatible
 
danke, ist ja eigentlich klar. Dann stand ich wohl auf der Leitung :wink:

Nikodel

TomyN 15. Dez 2020 11:02

AW: Integer/Extended inkompatible
 
By the way, Int / Int ergibt zwar in Delphi (noch?) Extended, aber in (fast) allen anderen Sprachen wieder einen Int. Daher habe ich mir in so einer Situation angewöhnt, den Divisor als rationale Zahl ( d.h. 2.0 statt 2 ) zu schreiben, damit es mir (und evtl. auch dem Compiler) klar ist.

Neutral General 15. Dez 2020 11:23

AW: Integer/Extended inkompatible
 
Ich bin erstaunt, dass das noch niemand erwähnt hat aber es gibt auch eine reine Integer-Division in Delphi:
Delphi-Quellcode:
nBl := StrToInt(BreiteNamen.Text) div 2 - 2;

Allerdings kommt da dann logischerweise immer eine Ganzzahl raus (Integer). d.h.
Delphi-Quellcode:
5 div 2 = 2

Delphi.Narium 15. Dez 2020 11:33

AW: Integer/Extended inkompatible
 
Das Ergebnis von DIV dürfte Trunc entsprechen, kann aber um 1 von Round abweichen.

Man muss also schon wissen, was man bei der Division von Integerwerten als Ergebnis erwartet.

DIV und Trunc ergeben immer das "abgerundete" Ergebnis, also den ganzszahligen Vorkommaanteil. Round rundet ggfls. auf die nächsthöhere Ganzzahl auf.
Delphi-Quellcode:
i := 42 div 9; // -> i = 4
i := Trunc(42 / 9); // -> i = 4
i := Round(42 / 9); // -> i = 5

Neutral General 15. Dez 2020 11:44

AW: Integer/Extended inkompatible
 
Kurzer Ergänzung: Wenn man eh Integer hat und als Ergebnis auch nur einen Integer benötigt also quasi das abgerundete Ergebnis was man auch durch Trunc erhalten würde, dann sollte man besser direkt div nutzen. Es macht keinen Sinn den PC mit einer Gleitkommaoperation zu belasten wenn man am Ende doch wieder nur den Integer haben will.

Moombas 15. Dez 2020 11:46

AW: Integer/Extended inkompatible
 
Wieso ggf.? Round richtet sich doch meines Wissens nach der mathematischen Vorgabe, also das ab 0,5 aufgerundet wird.
Oder habe ich das falsch im Gedächtnis?

DeddyH 15. Dez 2020 11:47

AW: Integer/Extended inkompatible
 
Für eine Halbierung könnte man auch einfach um eins nach rechts shiften :wink:

Delphi.Narium 15. Dez 2020 11:57

AW: Integer/Extended inkompatible
 
Zitat:

Zitat von Moombas (Beitrag 1479125)
Wieso ggf.? Round richtet sich doch meines Wissens nach der mathematischen Vorgabe, also das ab 0,5 aufgerundet wird.
Oder habe ich das falsch im Gedächtnis?

ggfls. -> es kommt auf's Ergebnis an.
ggfls. -> ab 0,5 aufrunden, sonst abrunden.
ggfls. -> es kommt drauf an oder eventuell oder unter gewissen Umständen oder so 'ne Art "entschiedenes Sowohlalsauch" ;-)

DIV und Trunc: immer abrunden.
Round: ergebnisentsprechend auf- oder abrunden.

Moombas 15. Dez 2020 12:12

AW: Integer/Extended inkompatible
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1479127)
Zitat:

Zitat von Moombas (Beitrag 1479125)
Wieso ggf.? Round richtet sich doch meines Wissens nach der mathematischen Vorgabe, also das ab 0,5 aufgerundet wird.
Oder habe ich das falsch im Gedächtnis?

ggfls. -> es kommt auf's Ergebnis an.
ggfls. -> ab 0,5 aufrunden, sonst abrunden.
ggfls. -> es kommt drauf an oder eventuell oder unter gewissen Umständen oder so 'ne Art "entschiedenes Sowohlalsauch" ;-)

DIV und Trunc: immer abrunden.
Round: ergebnisentsprechend auf- oder abrunden.

Also war ich richtig mit dem was ich noch im Gedächtnis hatte :P

himitsu 15. Dez 2020 12:39

AW: Integer/Extended inkompatible
 
Zitat:

Zitat von Moombas (Beitrag 1479125)
Round richtet sich doch meines Wissens nach der mathematischen Vorgabe, also das ab 0,5 aufgerundet wird.
Oder habe ich das falsch im Gedächtnis?

Nein.
Ja.

Round nutzt standardmäßig Bankers-Round,
also "gerecht" verteilt quasi abwechselnd bei 0,5 auf- und/oder abrunden. (gerade buw. ungerade Zahlen)

Und man kann mit Delphi-Referenz durchsuchenSetRoundMode sogar verändern, wie sich Delphi-Referenz durchsuchenRound verhält. :angle2:

mkinzler 15. Dez 2020 15:19

AW: Integer/Extended inkompatible
 
Um nun alle Möglichkeiten genannt zu haben und damit das Thema nicht ewig auszuweiten, sei noch RoundTo, Floor und (bedingt) Ceil genannt. Aber wirklich weiter bringt das den Nikodel auch nicht. Nur wir konnten wieder einmal zeigen, was wir alles Wissen.

himitsu 15. Dez 2020 15:44

AW: Integer/Extended inkompatible
 
Zitat:

Zitat von mkinzler (Beitrag 1479145)
Aber wirklich weiter bringt das den Nikodel auch nicht.

Lösungen hat er doch genug?
Kommt nur drauf an wie gerundet werden soll und welchen Typ er nun wirklich am Ende braucht.

* Eines teilt ganzzahlig und belässt den Integertypen
* Einiges rundet, aber der Typ bleibt ein Float
* Anderes rundet und ändert den Typ in einen Integer
* Manches rundet und ändert den Typ, aber nicht so, wie es gesagt wurde, und manchmal auch ganz anders
* ...


Es gab/gibt auch Fremdkomponenten/-codes, die grob fahrlässig permanent am SetRoundMode rumpfuschen und so, unbewusst für den Entwickler, das Verhalten des kompletten Programms verändern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 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