Это мой самый первый вопрос:
Первая из этих двух функций, которые вы видите ниже, работает в некоторой степени нормально:
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;
}
}
Когда я запустил это, я получаю:
Необработанное исключение в 0x00173746 в SE Game.exe: 0xC0000005: расположение чтения нарушения доступа 0x03acc0b8.
Когда я, когда через отладку, я обнаружил, что он падает на:
Когда итераторы переменные f == 31, i == 38, j = 139
И останавливается на AWSprite :: get_pixelColor_location () в строке «return * (Uint32 *) p;
Я обнаружил, что если я запустил его снова и прошёл отладку построчно, то я буду работать когда-нибудь, а иногда — нет !!! Таким образом, я имею в виду, что «это происходит случайным образом при f> 30, i, j значение итераторов»
Что здесь происходит…
Я пока не могу комментировать вопрос, но вот несколько вопросов:
Откуда приходит j? На основе get_pixelColor_location
Функция я бы предположил, что вы итерируете по ширине поверхности. Эта часть отсутствует в коде, который вы разместили.
Вы подтвердили, что i и j находятся в пределах вашей поверхности?
Кроме того, вы, кажется, не разблокировать поверхность.
Кажется, что выполнение вашей функции здесь работает адекватно, поэтому я подозреваю, что вы читаете вне буфера с недопустимыми параметрами.
Других решений пока нет …