我试图在这里找到错误,调试器停在以下位置:
Pthread_create renderer passed
Renderer loop (re)started
Process 84779 stopped
* thread #4: tid = 0x3603, 0x0000000101546c4b libjess.so`render_deformation + 667 at renderer.c:472, stop reason = EXC_BAD_ACCESS (code=1, address=0x36f0000)
frame #0: 0x0000000101546c4b libjess.so`render_deformation + 667 at renderer.c:472
469 for (i = 0; i < resy*resx; i++)
470 {
471 aux = (unsigned char *) ((*(tab1) << 2 ) + (unsigned int) buffer);
-> 472 *pix = *(aux) ;
473 pix++;
474 *pix = *(aux + 1);
475 pix++;
我怀疑它与指针转换有关。任何人都可以告诉我投射它的最佳方法。
该功能的完整代码(根据要求):
void render_deformation(int defmode)
{
unsigned int bmax, *tab1, *tab2, *tab3, *tab4, i;
unsigned char *pix = pixel , *buf = buffer, *aux;
SDL_LockSurface(screen);
/**************** BUFFER DEFORMATION ****************/
if (video == 8)
{
buf = buffer;
tab1 = table1;
tab2 = table2;
tab3 = table3;
tab4 = table4;
bmax = resx * resy + (unsigned int) pixel;
switch(defmode)
{
case 0:
memcpy(pixel,buffer,resx * resy);
break;
case 1:
for (pix = pixel; pix < (unsigned char *) bmax ; pix++)
*pix = *(buffer + *(tab1++)) ;
break;
case 2:
for (pix = pixel; pix < (unsigned char *) bmax; pix++)
*pix = *(buffer + *(tab2++)) ;
break;
case 3:
for (pix = pixel; pix < (unsigned char *) bmax; pix++)
*pix = *(buffer + *(tab3++)) ;
break;
case 4:
for (pix = pixel; pix < (unsigned char *) bmax; pix++)
*pix = *(buffer + *(tab4++)) ;
break;
default:
printf("Problem with blur_mode\n");
}
}
else
{
pix = pixel;
bmax = resx * resy;
switch(defmode)
{
case 0:
memcpy(pixel, buffer, pitch * resy);
goto nodef;
break;
case 1:
tab1 = table1;
break;
case 2:
tab1 = table2;
break;
case 3:
tab1 = table3;
break;
case 4:
tab1 = table4;
break;
default:
printf("Problem with blur_mode\n");
}
for (i = 0; i < resy*resx; i++)
{
aux = (unsigned char *) ((*(tab1) << 2 ) + (unsigned int) buffer);
*pix = *(aux) ;
pix++;
*pix = *(aux + 1);
pix++;
*pix = *(aux + 2);
pix+=2;
tab1++;
}
nodef:;
}
SDL_UnlockSurface(screen);
}
答案 0 :(得分:3)
aux = (unsigned char ) (((tab1) << 2 ) + (unsigned int) buffer);
我的猜测应该是:
aux = (unsigned char *) (((tab1) << 2 ) + (unsigned int) buffer);
255是指针的一个非常小的值或范围......
但是需要更多的代码,至少整个函数加上相关的定义/声明(什么是“缓冲区”?,为什么要转换为unsigned int?)。
更新111206:
似乎也是如此
bmax = resx * resy + (unsigned int) pixel;
应该是:
bmax = resx * resy + (unsigned int*) pixel;
和
aux = (unsigned char *) ((*(tab1) << 2 ) + (unsigned int) buffer);
哪个应该是
aux = (unsigned char) ((*(tab1) << 2 ) + (unsigned int*) buffer);
或:
aux = (unsigned char*) ((*(tab1) << 2 ) + (unsigned int) buffer);
这是所有基本指针算术:它是pointer := pointer + scalar;
或pointer = scalar + pointer;
,但pointer := pointer + pointer;
没有意义。第一个变体是最可能的变体(否则演员阵容不是必需的)。
不确定类型大小,但它们至少应该是指针。
还有一些错误的输入:
for (pix = pixel; pix < (unsigned char *) bmax ; pix++) {...}
像素和像素是char *; bmax是unsigned int;演员发臭。我希望有类似的东西:
for (pix = pixel; pix < pixel+bmax ; pix++) {...}
,可能限制(bmax)甚至应该乘以4,以便为每个单元格的24 + 8位颜色空间提供支持。
答案 1 :(得分:0)
可能发生的是,在第472行和第474行,您将数据存储到由aux指向的地址中的pix所指向的内存地址,但您的进程无法访问其中一个或两个地址。确保正确分配该内存。