Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: ungültige Typenumwandlung Single- Byte

  Alt 25. Mär 2004, 16:53
Zitat von Virchov:
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:
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:
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat