-1

構造体の配列を別の配列にバイナリコピーする関数を作成しました。問題はそれが正しく機能しないことです、そして私は理由がわかりません。私にはすべてが大丈夫のようです。

  • pixelは、3つのunsigned char、sizeof(pixel)=3の構造体です。
  • pixarr1は、2次元の動的配列[8] [2]へのポインターであり、
  • pixarr2は、2次元の動的配列[8][n]へのポインターです。たとえば、n = 8、それは重要ではありません。

私はこのようなことをする必要があります:

for(int i=0; i<8; i++) {
    for(int y=0; y<2; y++) {
        arr2[i][y] = arr1[i][y];
    }
}

しかし、私はそれを「バイナリ」にしたいのです。このような:

void copyStruct(pixel*** pixarr1, int startline, int height, pixel*** pixarr2) {

    pixel** arr1 = *pixarr1;
    pixel** arr2 = *pixarr2;
    unsigned char buffer[16];

    int sizeofstruct = height*3*8;
    int padding;

    for(int i=0; i<=sizeofstruct; i+=16) {
        if ( i+16 > sizeofstruct) {
            padding = sizeofstruct-i;
            memcpy(buffer, arr1+i, padding);
            memcpy(arr2+(startline*8)+i, buffer, padding);
        } else {
            memcpy(buffer, arr1+i, 16);
            memcpy(arr2+(startline*8)+i, buffer, 16);
        }
    }
}

私はどのような間違いを犯していますか?

PS。ソースに関する問題をお詫びします。このエディタは..です。

PPS。ポインタの使用に焦点を当てないでください。私はそれらを使わなければなりません。関数の外側と内側にポインターを出力すると、同じアドレスが表示されるので、(私のロジックでは)問題ありません。

4

1 に答える 1

0

ポインターを使用して関数に配列を渡すことはできますが、ポインターツーポインターを使用して多次元配列を渡すことはできません。多次元配列へのポインターの作成について詳しくは、次を参照してください。

編集: ここでもっと情報が必要です。「うまくいかない」とは具体的にどういうことですか?データはコピーされましたが、最後のバイトが欠落していますか? プログラムがクラッシュしますか?マシンがブルースクリーンになり、喫煙を開始しますか? プログラムが何をしているのか、また、期待していたものとどのように違うのかを正確に教えてください。

ここで行われているポインター操作の量を考えると、デバッガーでコードをステップ実行し、すべてのポインターをすべてのステップで再確認することを強くお勧めします。これにより、どこで問題が発生し始めているかが明確に示され、その理由について強力なヒントが得られるはずです。

上位レベル (非memcpy) バージョンのコードが機能する場合は、その関数に対して発行されたアセンブリを調べて、memcpyベース バージョンに対して発行されたアセンブリと比較することをお勧めします。一部のライブラリmemcpyは、バイトサイズのコピーのループを実装しています。これにより、バイナリ バージョンが上位レベルのバージョンと実質的に同等になります。その場合、memcpyバージョンを使用しても、複雑さが増したこと以外はおそらくあまり得られません。

于 2012-04-10T20:27:32.867 に答える