![]() |
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:
Der hochgepriesene Compiler moniert, ich hätte zweimal in dieser Zeile ungültige Typenumwandlung zugelassen. Könnte mir jemand in diesem Unheil behilflich sein?
var
..... Normalisedv:BYTE; .... begin ..... ..... NormalisedV:= BYTE(roiHistogram[idx])* ( (single(MAXBYTE) / single(roiHistogramMax) ); .... .... end; Vielen Dank! :smile2: |
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 |
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 |
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 |
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)) ); |
Re: ungültige Typenumwandlung Single- Byte
So ging es aber:
Delphi-Quellcode:
Geht da keine Information über die Genauigkeit der Variableninhalte verloren? Meines Wissens, nicht...NormalisedV:= BYTE (roiHistogram[idx] * ( (*single*)(MAXBYTE) div (*single*)(roiHistogramMax) ); |
Re: ungültige Typenumwandlung Single- Byte
Zitat:
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:
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).
NormalizedV := round(roiHistogram[idx] * (MAXBYTE / roiHistogramMax));
Oder man verzichtet GANZ auf Casts und macht's mit dem "div"-Operator:
Delphi-Quellcode:
Diese Zeile sollte ebenfalls gültig sein, allerdings wird eben nur abgerundet.
NormalizedV := roiHistogram[idx] * (MAXBYTE div roiHistogramMax);
Hoffe, das war verständlich... gruss, dizzy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 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 by Thomas Breitkreuz