2

この関数は、生のピクセル値を読み取るときにアクセス違反をスローしていますが、その理由がわかりません。これを実行中のコードの唯一の部分と見なすことができます。このソロを実行しても同じ結果が得られました。

string filenames[]={"firstclick.raw", "secondclick.raw","thirdclick.raw","fourthclick.raw","fifthclick.raw","sixthclick.raw","seventhclick.raw","eighthclick.raw"};
FILE *file;
int height= 750, width = 453, bbp=3;

unsigned char ****images;
images = (unsigned char ****)malloc(sizeof(unsigned char ***)*8);
for(int j = 0; j<8; j++){
    images[j] = (unsigned char ***)malloc(sizeof(unsigned char**)*height);
    for(int i = 0; i<height; i++){
        images[j][i]= (unsigned char **)malloc(sizeof(unsigned char*)*width);
        for(int k = 0; k<bbp; k++)
            images[j][i][k]= (unsigned char *)malloc(sizeof(unsigned char)*bbp);
    }
}

for (int i = 0; i<8; i++){
    if (!(file=fopen(filenames[i].c_str(),"rb"))){
        cout << "Cannot open file: "<<filenames[i].c_str() <<endl;
        exit(1);
    }
    fread(images[i], sizeof(unsigned char), height*width*bbp, file);
    fclose(file);
}
4

2 に答える 2

1

メモリブロックをメモリ内の異なる場所に割り当てると、その構造の fread は機能しません。

代わりに、1 つの大きなブロックを割り当ててから、ブロック内を指すようにポインターを設定します。これにより、fread を使用できます。

于 2013-09-19T23:31:01.287 に答える
1

ここでの問題は、配列の各要素を個別の配列として割り当てたことです (メモリ内の別の場所で、その場所はポインターとして保持されます)。しかし、読み込んでみると、それが 1 つの連続したブロックであると想定します。これらすべてのポインターを上書きし、バッファーをオーバーフローさせて起動します。

imagesメモリの個別のブロックのセットになりたい場合は、次のように割り当てます。

unsigned char ** images;
int i;

images = malloc( sizeof(unsigned char *) * 8 );
for( i = 0; i < 8; i++ ) {
    images[i] = malloc( width * height * bpp );
}

標準では常に 1 と定義されていることに注意してくださいsizeof(unsigned char)。常に乗算する必要はありませんsizeof(unsigned char)

ここで、画像内のピクセル アドレスを取得するには、乗算する必要があります (通常は行優先):

unsigned char * pixel = images[i] + (y * width + x) * bpp;
unsigned char r = pixel[0];
unsigned char g = pixel[1];
unsigned char b = pixel[2];
于 2013-09-19T23:31:47.460 に答える