Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ungültige Typenumwandlung Single- Byte (https://www.delphipraxis.net/18848-ungueltige-typenumwandlung-single-byte.html)

Virchov 25. Mär 2004 09:23


ungültige Typenumwandlung Single- Byte
 
Morgen, meine Herrschaften!

Wieder mal eine kleene Frage von Virchov:

Ich habe in c++- Code diese Zeile hier:

NormalisedV:= BYTE (roiHistogram[idx] * ( single(MAXBYTE) div single(roiHistogramMax)) );

Die ich naturgemäß folgendermaßen in Delphi übersetzt habe:

Delphi-Quellcode:
var
.....
Normalisedv:BYTE;
....

begin
.....
.....
 NormalisedV:= BYTE(roiHistogram[idx])*  ( (single(MAXBYTE) / single(roiHistogramMax) );
....
....
end;
Der hochgepriesene Compiler moniert, ich hätte zweimal in dieser Zeile ungültige Typenumwandlung zugelassen. Könnte mir jemand in diesem Unheil behilflich sein?

Vielen Dank! :smile2:

Virchov 25. Mär 2004 09:27

Re: ungültige Typenumwandlung Single- Byte
 
Wohljemerkt: roiHistogram ist ein array of BYTE, MAXBYTE ist eine Windowskonstante und roiHistogramMax
müsste gleichwohl ein array of BYTE sein

Sharky 25. Mär 2004 09:32

Re: ungültige Typenumwandlung Single- Byte
 
Hai Virchov,

nur eine kleine Anmerkung. Du kannst, um deine Beiträge zu ergängen, diese innerhalb von 24 Stunden editieren und musst keinen neuen Beitrag darunter setzen. :-D

Virchov 25. Mär 2004 09:36

Re: ungültige Typenumwandlung Single- Byte
 
Ich habe eine interessante Sache feststellen müssen:


roiHistogramMax wurde früher als static BYTE deklariert. Nun habe ich static weggenommen, da in delphi soetwas wie "static" anscheinend nicht existiert.... Oder doch? :gruebel:

alles klar, Scharky, mach ich.

Helft, doch, bitte, einem von Wirren Welten des Programmierens benommenen Geisteswissenschaftler :-D

Virchov 25. Mär 2004 10:08

Re: ungültige Typenumwandlung Single- Byte
 
So sieht es aus in meiner Endfassung, geht aber trotzdem nicht. Die Reaktion des Compilers bleibt unverändert:


NormalisedV:= BYTE (roiHistogram[idx] * ( single(MAXBYTE) div single(roiHistogramMax)) );

Virchov 25. Mär 2004 10:14

Re: ungültige Typenumwandlung Single- Byte
 
So ging es aber:
Delphi-Quellcode:

NormalisedV:= BYTE (roiHistogram[idx] *  ( (*single*)(MAXBYTE) div (*single*)(roiHistogramMax) );
Geht da keine Information über die Genauigkeit der Variableninhalte verloren? Meines Wissens, nicht...

dizzy 25. Mär 2004 15:53

Re: ungültige Typenumwandlung Single- Byte
 
Zitat:

Zitat von Virchov
Delphi-Quellcode:
NormalisedV:= BYTE (roiHistogram[idx] *  ( (*single*)(MAXBYTE) div (*single*)(roiHistogramMax) );

Ich nehme an:
NormalizedV : Byte
roiHistogram : array of Byte
MAXBYTE : Byte
roiHistogramMax : Byte

"/" ist in Delphi der Disivionsoperator für Fließkommawerte, und "div" für Ganzzahlenwerte. Byte ist immer ganzzahlig. Bei einer "div"-Division gehen Informationen verloren, z.B. bei 10 div 3. Das Ergebnis bei "div": 3 (es wird immer abgerundet!) und bei "/": 3.3333...

Wenn du das Ergebnis ordentlich gerundet (ab n.5 aufgerundet), dann mach es am besten so:
Delphi-Quellcode:
NormalizedV := round(roiHistogram[idx] * (MAXBYTE / roiHistogramMax));
Der Typecast nach "single" weiter oben war unnötig. Das Problem ist, dass eine "/"-Division IMMER ein Ergebnis vom Typ "double" liefert, und so keinem "Byte" zugewiesen werden kann. Daher muss man vorher Casten. Entweder so wie du oben mit BYTE(...) (Wird abgerundet), oder eben mit round(...). Es ginge auch noch trunc(...) (auch hier wird abgerundet/der Nachkommaanteil einfach abgeschnitten).
Oder man verzichtet GANZ auf Casts und macht's mit dem "div"-Operator:
Delphi-Quellcode:
NormalizedV := roiHistogram[idx] * (MAXBYTE div roiHistogramMax);
Diese Zeile sollte ebenfalls gültig sein, allerdings wird eben nur abgerundet.



Hoffe, das war verständlich...


gruss,
dizzy


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz