0

最近、キャストする必要がある場合は何か間違ったことをしていると他の人に話している人を何人か見ました。私はC++でこのコードを持っています

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

byte*GetBits() が を返すため、ここでは a にキャストしますvoid*。では、どうすればよいでしょうか

  • pixelキャストせずにバイトを保持している*
  • 使用するvoid*(このタイプは使用したことがありません)

明確にするために、次にpixelこれと同様の使用を続けます。

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

4 に答える 4

2

あなたの場合、キャストは正当化されますが、C++ では、C++ スタイルのキャストの 1 つを使用することをお勧めします。したがって、ここでは次のように使用できますstatic_cast

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

さまざまな C++ スタイルのキャストと、それをどこで使用するかについて学習するには、次のトピックをお読みください。

于 2012-04-15T18:53:36.487 に答える
2

aは逆参照/インクリメント/何でもできないvoid *ため、キャストなしで使用することは定義上不可能です。void *それは単に「ここにあるデータへのポインターがあります。どのような種類かわかりません」という意味です。

GetBits()void *データにアクセスするための最良の方法は、画像の種類 (特に色深度から) と実行したい精緻化の種類に依存するため、a を返します。当然、そのようなデータに対して何かを行うには、何かにキャストする必要があります。

于 2012-04-15T18:56:04.557 に答える
1

あなたは本当にどこでも質問をしているのではないので、byte*あなたのものは危険かもしれないので、 a 以外のものにキャストするときについて少しコメントさせてください: 返されたポインタが 2 バイト型へのポインタにキャストされている場合、4-バイト型などであり、指定された値がそのサイズの型に対して正しく整列されていない場合、特定のアーキテクチャではプロセスを完全に強制終了するデータの不整列エラーが発生する可能性があります。byte*キャストは安全です。これは、最小のアラインメントのタイプを指すためです。つまり、常に正しくアラインメントされます。

于 2012-04-15T20:15:02.377 に答える
1

あなたの質問は明らかです。キャストは、常に何か間違ったことをしているという意味ではありませんが、コードの匂いです。

あなたの特定のケースでは、コードの匂いがvoid *. を返す関数が必要なのはなぜvoid *ですか?

于 2012-04-15T18:53:45.633 に答える