-1

これは私の最初の質問です:

以下に示すこれら2つの機能の最初のものは、ある程度正常に機能します。

Uint32 AWSprite::get_pixelColor_location(SDL_Surface * surface, int x, int y) {
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to retrieve */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

switch (bpp) {
case 1:
    return *p;
case 2:
    return *(Uint16 *)p;
case 3:
    if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
        return p[0] << 16 | p[1] << 8 | p[2];
    else
        return p[0] | p[1] << 8 | p[2] << 16;
case 4:
    return *(Uint32 *)p;
default:
    return 0;       
}

}

void AWSprite::set_all_frame_image_actual_size() {
/* This function finds an entire rows that has transparency
   then stores the amount of rows to a Frame_image_absolute structure
*/
absolute_sprite = new Frame_image_absolute*[howManyFrames];
for (int f = 0; f < howManyFrames; f++) {
    SDL_LockSurface(frames[f]);
    int top_gap = 0; int bottom_gap = 0;
    int per_transparent_px_count = 1;
    for (int i = 0; i < frames[f]->h; i++) {
        int per_transparent_px_count = 1;
            if (this->get_pixelColor_location(frames[f], j, i) == transparentColour) per_transparent_px_count++;
            if (per_transparent_px_count >= frames[f]->w) {
                if (i < frames[f]->h / 2) {
                    per_transparent_px_count = 1;
                    top_gap++; 
                } else {
                    per_transparent_px_count = 1;
                    bottom_gap++;
                }
            }
        }
    }
    int realHeight = frames[f]->h - (top_gap + bottom_gap);
    absolute_sprite[f] = new Frame_image_absolute();
    absolute_sprite[f]->offset_y = top_gap;
    absolute_sprite[f]->height = realHeight;
}

}

これを実行すると、次のようになります: SE Game.exe の 0x00173746 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x03acc0b8.

デバッグ中にクラッシュすることがわかりました: When iterators variable f == 31, i == 38, j = 139 And stop at AWSprite::get_pixelColor_location() 行の " return *(Uint32 *)p ;

もう一度実行して1行ずつデバッグすると、いつかはうまくいくことがわかりました。つまり、「f > 30、i、j イテレータ値の場合、ランダムにクラッシュする」ということです。

何が起こっている...

4

1 に答える 1

1

質問についてはまだコメントできませんが、いくつか質問があります。

j はどこから来たのですか? 関数に基づいてget_pixelColor_location、サーフェスの幅を反復処理していると想定します。この部分は、投稿したコードから欠落しているようです。

i と j がサーフェスの境界内にあることを確認しましたか?

また、表面のロックを解除していないようです。

関数の実行はここで適切に機能しているように見えるため、無効なパラメーターを使用してバッファーの外側を読み取っていると思われます。

于 2012-11-11T19:40:25.730 に答える