2017-05-12 2 views
0

표면의 픽셀을 읽고 가장 밝은 픽셀의 인덱스를 다른 배열에 씁니다. gdb를 사용하여 픽셀 배열의 모든 값이 정확히 3/4이되고, 그 점에서 정확히 1020 픽셀 후에 segfaults가됩니다. 이 코드는 다음과 같습니다.표면의 SDL 픽셀은 0 3/4의 길이가됩니다.

void scanBrightPixels(int** write_to, int* pcount, SDL_Surface* image) { 
    SDL_PixelFormat* f = image->format; 
    SDL_LockSurface(image); 
    Uint32* pixels = (Uint32*) image->pixels; 
    SDL_UnlockSurface(image); 
    int lpcount = 0; 
    for (int i = 0; i < image->w * image->h/4 * 3; i++) { 
     Uint8 r, g, b; 
     Uint8 brightness; 
     SDL_GetRGB(pixels[i], f, &r, &g, &b); // this is where the segfault happens 
     brightness = (Uint8) ((r * 0.33) + (g * 0.5) + (b * 0.16)); 
     if (brightness >= 251) { 
      (*write_to)[lpcount] = i; 
      lpcount++; 
     } 
    } 
    *pcount = lpcount; 
} 

이 함수는 std :: async에서도 호출됩니다. 어떤 아이디어?

답변

0

픽셀 포인터를 사용한 후에야 SDL_UnlockSurface를 호출해야합니다. 잠금 해제를 호출 한 후 픽셀이 유효하지 않을 수 있습니다. 이것은 표면이 GPU에 저장되는 경우 특히 그렇습니다. 그렇지 않으면 잠금 해제를 호출 한 후에도 실수로 작동 할 수 있습니다.

코드의 다음 행이 메모리에서 끝나는 즉시 시작된다는 보장은 없습니다. SDL_Surface 멤버 피치는 인접한 두 행의 시작 사이의 메모리에있는 바이트 수입니다.

마지막으로 루프 끝 인덱스를 계산할 때 "/ 4 * 3"의 의도가 확실하지 않습니다.

이 정보가 도움이되기를 바랍니다.