AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

ungültige Typenumwandlung Single- Byte

Ein Thema von Virchov · begonnen am 25. Mär 2004 · letzter Beitrag vom 25. Mär 2004
Antwort Antwort
Virchov

Registriert seit: 15. Mär 2004
Ort: Bäärlin
109 Beiträge
 
#1

ungültige Typenumwandlung Single- Byte

  Alt 25. Mär 2004, 09:23
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!
  Mit Zitat antworten Zitat
Virchov

Registriert seit: 15. Mär 2004
Ort: Bäärlin
109 Beiträge
 
#2

Re: ungültige Typenumwandlung Single- Byte

  Alt 25. Mär 2004, 09:27
Wohljemerkt: roiHistogram ist ein array of BYTE, MAXBYTE ist eine Windowskonstante und roiHistogramMax
müsste gleichwohl ein array of BYTE sein
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#3

Re: ungültige Typenumwandlung Single- Byte

  Alt 25. Mär 2004, 09:32
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Virchov

Registriert seit: 15. Mär 2004
Ort: Bäärlin
109 Beiträge
 
#4

Re: ungültige Typenumwandlung Single- Byte

  Alt 25. Mär 2004, 09:36
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?

alles klar, Scharky, mach ich.

Helft, doch, bitte, einem von Wirren Welten des Programmierens benommenen Geisteswissenschaftler
  Mit Zitat antworten Zitat
Virchov

Registriert seit: 15. Mär 2004
Ort: Bäärlin
109 Beiträge
 
#5

Re: ungültige Typenumwandlung Single- Byte

  Alt 25. Mär 2004, 10:08
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)) );
  Mit Zitat antworten Zitat
Virchov

Registriert seit: 15. Mär 2004
Ort: Bäärlin
109 Beiträge
 
#6

Re: ungültige Typenumwandlung Single- Byte

  Alt 25. Mär 2004, 10:14
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...
  Mit Zitat antworten Zitat
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, 15: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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 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