2

私はビデオ処理プロジェクトを行っていますが、dct関数に送信するためのブロックアドレスを割り当てることに気づきました。

次の行は、を指す右側の変数として正しい割り当てアドレスを取得していません。

temp = (unsigned short *)((unsigned short *)(p_vqi->luma + j) + l);

したがって、変数がtemp指す正しいアドレスは含まれていません。ここで、およびは各ステップで16回インクリメントされ、それぞれ最大144および176になります。p_vqi->lumaji

4

3 に答える 3

2

ポインター演算でよくあるのは、一度に 1 バイトずつ追加するのではなく、一度に 1 バイトずつ追加するため、どんなに大きくても lumassizeof(thing pointed to)をスキップしてからunsigned short をスキップするということです。それはあなたのアーキテクチャにあります。通常、次のように、固定形式で直接バイト単位で作業する方が簡単で移植性が高くなります。ji

uint8_t* temp = (uint8_t*)p_vqi->luma;
temp += j*16 + i;
于 2011-05-11T07:07:59.593 に答える
2

ポインターに数値を追加すると、バイト数ではなく、その要素数だけポインターがインクリメントされることに注意してください。j * sizeof(the type of the luma entries)つまり、最初にポインターに追加し、次にi * sizeof(unsigned short)ほとんどの実装で 2 バイトになります。

ただし、j + i バイトを追加する場合は、むしろ次のようにする必要があります。

temp = (unsigned short *)((intptr_t)p_vqi->luma + j + i);

これにより、元から i + j バイト進んだ unsigned short へのポインタが得られるはずです。intptr_t 型は C99 です。古いコンパイラとの互換性が必要な場合は、代わりに unsigned long を使用してください。

于 2011-05-11T07:09:36.113 に答える
1

ポインターの加算 (および減算) は、標準の算術演算とは異なる動作をします。これらの操作は、それらが表すデータのサイズによって因数分解されます。

char が 1 バイト、short が 2 バイト、int が 4 バイトの長さであることを考慮して、例を見てみましょう。

char * p1;
shot * p2;
int * p3;

p1 += 1; // p1 will be incremented by 1
p2 += 1; // p2 will be incremented by 2
p3 += 1; // p3 will be incremented by 4
于 2011-05-11T07:10:13.053 に答える