0

プログラムで使用したいこの関数を作成しましたが、何らかの理由で、何も問題がないにもかかわらず失敗します。

std::deque <std::deque <bool> > load_image(std::string & image_name){
    SDL_Surface * image = open_image(image_name);
    if (!image)
        exit(3);
    Uint32 * pixels = (Uint32 *) image -> pixels;
    std::deque <std::deque <bool> > grid(HEIGHT, std::deque <bool>(WIDTH, false));
    for(int y = 0; y < std::min(image -> h, HEIGHT); y++)
        for(int x = 0; x < std::min(image -> w, WIDTH); x++)
            grid[y][x] = (pixels[(image -> w * y) + x] == 0);
    SDL_FreeSurface(image);
    return grid;
}

ピクセルが黒かどうかをにコピーしようとしていgridます。個別に実行するgrid[y][x]と、プログラムは正常に実行されます。(pixels[(image -> w * y) + x] == 0)するとgrid[y][x] = (pixels[(image -> w * y) + x] == 0);、画像の途中でプログラムがクラッシュします。

何に関係なく、制限されているので(image -> w * y) + x、正しいピクセルを取得できると確信しています。何が表示されないのでしょうか。xy

4

1 に答える 1

2

プログラムは画像の途中でクラッシュします。

メモリの読み取りまたは書き込みがクラッシュするかどうかについて言及するのを忘れました。また、VisualStudio / gdbを使用するか、/の値を/にダンプすることにより、デバッグを試みることyもできxます。stderrOutputDebugString

grid [y] [x] =(pixels [(image-> w * y)+ x] == 0);

いいえ。

単一ピクセルの使用に対処するには:

&((const char*)image->pixels)[y * image->pitch + x*image->format->BytesPerPixel];

また

(const Uint32*)((const char*)image->pixels + y * image->pitch + x*image->format->BytesPerPixel)

ピクセルは32ビットであることが保証されていません。また、これがソフトウェアサーフェスでない場合は、ロックする必要があります。SDL_SurfaceおよびSDL_PixelFormatのドキュメントを参照してください

于 2012-01-17T22:23:08.603 に答える