0

代わりに、最後に memcpy を使用したい

block_orig_left[i1][j1]=block_orig[i1][j1];
pred_orig_left [i1][j1]=block_pred[i1][j1];

memcpy の使用中にエラーが発生しました

src/coder.c:909: エラー: バイナリへのオペランドが無効です * ('unsigned int' と 'int **' があります)
src/coder.c:910: エラー: バイナリへのオペランドが無効です * ('unsigned int' と'int **')

int **block_orig_left=NULL;

block_orig_left=intmatrix(BSIZE_Y_LEVEL[levelv], BSIZE_X_LEVEL[levelv]);
pred_orig_left=intmatrix(BSIZE_Y_LEVEL[levelv], BSIZE_X_LEVEL[levelv]);

for(i1=0; i1<BSIZE_Y_LEVEL[levelv]; i1++)
for(j1=0; j1<BSIZE_X_LEVEL[levelv]; j1++)
{
    block_orig_left[i1][j1]=block_orig[i1][j1];
    pred_orig_left[i1][j1]=block_pred[i1][j1];
    Average_block_orig_left+=block_orig[i1][j1];        
} 
memcpy(block_orig_left, block_orig, sizeof(int **)*block_orig);

memcpy(pred_orig_left, block_pred,  sizeof(int **)*block_pred);

memcpy を正しく使用するにはどうすればよいですか?

4

3 に答える 3

4

block_orig、block_pred、block_orig_left、および pred_orig_left はすべて として宣言されていると想定していint**ます。コードにはそのうちの 1 つだけが表示されます。

発生しているエラーは、memcpy へのパラメーターにありますsizeof(int **)*block_orig。整数 ( sizeof(int**)) を int** 型の変数で乗算しようとしています。コンパイラはその乗算を理解できません。

長さパラメーターを memcpy に修正する必要がありますが、それでも期待どおりには機能しません。

// Still won't work.
memcpy(block_orig_left, block_orig, sizeof(int) * BSIZE_Y_LEVEL[levelv] * BSIZE_X_LEVEL[levelv]);

Anint**は、整数の配列へのポインターの配列です。int** を memcpy しようとすると、外側の配列を上書きしてしまいます。したがって、ループが必要で、内側の配列をコピーする必要があると思います。

これはうまくいくはずです。

for(int i = 0; i < BSIZE_Y_LEVEL[levelv]; i++)
{
    memcpy(block_orig_left[i], block_orig[i], sizeof(int) * BSIZE_X_LEVEL[levelv]);
}
于 2010-12-20T22:06:32.143 に答える
2

int** のサイズに int** を掛けていますが、これは意味がありません。つまり、トラックに乗っているすべての車の重量を知りたい場合、「車 1 台の重量」に「トラック」を掛けることはできません。車 1 台の重量にトラックの台数を掛ける必要があります。

memcpy の 3 番目のパラメーターは、コピーするバイト数です。int* のサイズを正しく取得していますが、構造内の int * の数を掛けたいとします。したがって、私があなたのコードを正しく理解している場合は、

sizeof(int**) * BSIZE_Y_LEVEL[levelv] * BSIZE_X_LEVEL[levelv]

コピーしている構造には、多くの int double ポインターが含まれているように見えるためです。

編集: David Yaw の答えを見ると、彼が正しいことがわかります。内部ポインターがすべて一度に割り当てられるのではなく、for ループなどで割り当てられる可能性が高いという事実に対処できなかったため、同様の方法でコピーする必要があります。上記の私の方法では、適切な量のメモリがコピーされますが、必ずしも正しいメモリであるとは限りません。

于 2010-12-20T22:06:19.340 に答える
0
memcpy(block_orig_left, block_orig, sizeof(int **)*block_orig);

sizeof(int **)*block_origサイズとポインターの乗算です。コンパイラ エラーからわかるように、ポインターを乗算することは意味がなく、可能でもないことを知っていると思います。

私はあなたの他の変数が何を意味するのかわかりませんblock_orig(ところで、自己記述型の変数名について聞いたことがありますか?)変数memcpyは、ターゲット、ソース、およびバイト単位のサイズを引数として受け取ります。

整数行列の場合、sizeof(int) * numberOfElementsToCopyターゲットメモリが連続している場合(つまり、2D配列)のようなものは理にかなっています。

于 2010-12-20T22:06:22.177 に答える