1

次のようにメモリを割り当てるとします。

Create(int width, int height, int depth)
{    
    size_t numBits = width * height * depth;
    size_t numBytes = numBits / 8 + numBits % 8 != 0 ? 1 : 0;
    bytes = malloc(numBytes);
    ...

次に、指定された x、y、b のバイト オフセットを取得します。

DoSomething(int x, int y, int bit)
{
    Byte* byte = bytes + ... some offset ...

たとえば、私が言っCreate(3, 3, 3)DoSomething(0, 1, 1)場合、バイト オフセットは 0 としてDoSomething(0, 2, 2)計算されます。それが 9 番目のビットになると言った場合、オフセットは 1 として計算されます。

Byte を取得したら、必要な操作を実行できます。

4

1 に答える 1

1

まず、演算子の優先順位が間違っていると思います。次のようにバイト数の計算を行う場合

numBits / 8 + numBits % 8 != 0 ? 1 : 0

次に、次のように解析されます

(numBits / 8 + numBits % 8 != 0) ? 1 : 0

つまり、常に 0 または 1 バイトが割り当てられることになります。私はあなたが意味したと思います

numBits / 8 + (numBits % 8 != 0 ? 1 : 0);

代わりは。または、通常のラウンドアップ トリックを実行します。

numBytes = (numBits + 7) / 8;

はい、手で計算を行うことができますが、単純に配列へのポインターを使用して、難しい計算をコンパイラーに任せないのはなぜですか?

unsigned char (*mat)[height][depth] = malloc((width + 7) / 8 * sizeof(*mat));

次に、アドレスを取得するのは簡単です。

unsigned char *ptr = &mat[x / 8][y][z];
于 2013-08-27T04:30:03.633 に答える