-3

C++ でアプリケーションを開発していますが、変数の要素数を知る必要があります。これを行う方法を探していますが、これに対する解決策を見つけることができません。変数は次のように定義されます。

unsigned char *values = (unsigned char *) some_function(some_parameter);
// "some_function" takes "some_parameter" and fills "values" correctly

ご協力いただきありがとうございます。

よろしくお願いします。

4

2 に答える 2

3

使用している関数 ( FreeImage::GetBits ) を教えていただいたので、画像の生データをクエリしていることがわかります。そのサイズは、次の式に示すように、画像のピッチと高さの積です。

int size = image.GetPitch() * image.GetHeight();

これはバイト単位のサイズであり、charポインターにアクセスする場合の要素の数です。しかし、そのような場合に「要素の数」について話すこと (低レベルのメモリ、高レベルの型を持たないビット ストリームについて話す場合) は、質問を読んだときにそれが約より高いと考えるかもしれないので、少し誤解を招く可能性があります。レベル配列

ご参考までに: 生の画像データは、通常pitch、左から右に 1 ピクセルずつ size の行に配置されます。ピクセルあたりのサイズは、ストレージ形式によって異なります (たとえば、1 バイトのグレースケール、3 バイトの RGB と 8ビット/チャネル、モノクロ ビットマップの場合は 1 ビット、その他多数の形式)。

これらの行は、上から下 (ほとんどの場合) または下から上 (たとえば、BMP ファイル形式の場合) に配置されます。pitch少なくとも画像のwidthピクセルあたりのサイズを掛けたものであるため、すべてのピクセルはそのような「スキャンライン」にスペースを持ちます。これは、画像の行ごとのメモリがどのように呼び出されるかです。いくつかの位置合わせに切り上げられるため、すべての行は、イメージ全体のメモリ内の位置合わせされたアドレスから開始できます。未使用のスペースは「パディング」と呼ばれ、無視されます。

ライブラリによっては、「ピッチ」が「1 行あたりのバイト数」ではなく、メモリ内の「1 行あたりのピクセル数」を意味する場合がありますが、この場合は既にバイト単位で指定されているため、画像の高さを掛けるだけで済みます。通常、高さは幅のようにパディングされないことに注意してください。これを行う利点がないためです。

于 2013-09-23T14:30:53.163 に答える
2

配列の先頭へのポインターが与えられた場合、配列の長さを決定論的に知ることはできません。配列とともにいくつかの情報を渡す必要があります。

その追加情報は、次の形式である場合があります。

  • 長さを指定する別の戻り値
  • 長さを配列の先頭にエンコードする、合意されたエンコード
  • 配列の終わりを示す合意されたエンコーディング (例:\0文字列の最後)
于 2013-09-23T14:14:23.217 に答える