2012-04-15 12 views
0

Kürzlich habe ich ein paar Leute gesehen, die anderen sagen, dass sie etwas falsch machen, wenn sie müssen. Ich habe diesen Code in C++Vermeiden von Cast bei der Verwendung von CImage

byte* pixel = (byte*)image->GetBits(); 

Hier warf ich einen byte* weil GetBITS() eine void* zurückgibt. So wie würde ich entweder

  • habe pixel einen Byte halten * ohne Gießen
  • Verwendung void* (Ich habe noch nie diese Art vor verwendet)

Um zu klären, ich gehe auf dann ähnlich verwenden pixel dazu.

*(pixel) += 20; 
*(pixel + 1) += 20; 
*(pixel + 2) += 20; 

Antwort

2

In Ihrem Fall Casting ist gerechtfertigt, aber in C++, einen besseren Weg zu werfen einen der C++ - Casts, so hier Sie static_cast wie verwenden:

byte* pixels = static_cast<byte*>(image->GetBits()); 

um zu erfahren, über die verschiedenen C++ - Casts, und wo zu verwenden, die, lesen Sie diese Themen:

+0

Vielen Dank für Ihre Antwort. Kannst du den Unterschied zwischen einem normalen und einem statischen Cast erklären? –

+0

@AshBurlaczenko: Bearbeitete meine Antwort mit einigen wirklich guten Links. – Nawaz

1

Ihre Frage ist klar. Casting bedeutet nicht immer, dass du etwas falsch machst, aber es ist ein Code-Geruch.

In Ihrem speziellen Fall gibt der Code-Geruch eine void * zurück. Warum benötigen Sie eine Funktion, die void * zurückgibt?

+0

Ich definiere die Funktion nicht, sie ist Teil der API von CImage, http://msdn.microsoft.com/en-us/library/zx1ex9b5(v=vs.80).aspx. –

+0

@AshBurlaczenko so MS dann etwas falsch gemacht. :) Wäre nicht das erste Mal. –

+0

@LuchianGrigore: Ich weiß nicht, es gibt keinen Typ, der für diesen Rückgabewert wirklich korrekt wäre. –

2

Die Verwendung von void * ohne eine Umwandlung ist per Definition unmöglich, da eine void * nicht dereferenziert/inkrementiert werden kann/was auch immer. Es bedeutet nur "hier ist ein Zeiger auf einige Daten, ich weiß nicht welche Art".

GetBits() gibt eine void * zurück, da die beste Art, auf die Daten zuzugreifen, von der Art des Bildes (insbesondere von der Farbtiefe) und von der gewünschten Ausführung abhängt; Natürlich müssen Sie es in etwas umwandeln, um etwas mit solchen Daten zu tun.

1

Sie fragen nicht wirklich irgendwo eine Frage, also lassen Sie mich ein wenig darüber sprechen, wenn Sie auf etwas anderes als byte* in Fällen feuern, in denen Ihr gefährlich sein könnte: wenn der zurückgegebene Zeiger auf einen Zeiger auf ein 2- B. Byte-Typ, 4-Byte-Typ usw., und der Wert, auf den gezeigt wird, ist für einen Typ dieser Größe nicht korrekt ausgerichtet, da ein Datenfehlausrichtungsfehler auftreten kann, der bei bestimmten Architekturen einfach Ihren Prozess umbringt. Für die byte* ist die Besetzung sicher, da sie auf den Typ der kleinsten Ausrichtung zeigt, nämlich , d. H., ist sie immer korrekt ausgerichtet.

Verwandte Themen