0

我试图在这里找到错误,调试器在以下位置停止:

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);
}
4

2 回答 2

3
aux = (unsigned char ) (((tab1) << 2 ) + (unsigned int) buffer);

我的猜测是应该是:

aux = (unsigned char *) (((tab1) << 2 ) + (unsigned int) buffer);

255 是一个非常小的值或范围的指针......

但是需要更多的代码,至少是整个函数加上相关的定义/声明(什么是“缓冲区”?为什么要转换为无符号整数?)。

更新 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;or pointer = scalar + pointer;,但pointer := pointer + pointer;没有意义。第一个变体是最可能的变体(否则就不需要强制转换)。

不确定类型的大小,但它们至少应该是指针。

仍然涉及一些错误的输入:

for (pix = pixel; pix < (unsigned char *) bmax ; pix++) {...}

像素和像素是char*;bmax 是一个无符号整数;演员很臭。我希望是这样的:

for (pix = pixel; pix < pixel+bmax ; pix++) {...}

,并且可能甚至应该将限制 (bmax) 乘以 4,以便为每个单元颜色空间 24+8 位留出位置。

于 2011-12-05T22:11:20.760 回答
0

可能发生的情况是,在第 472 行和第 474 行,您将数据从 aux 指向的地址存储到 pix 指向的内存地址,但您的进程无法访问这些地址中的一个或两个。确保您正确分配了该内存。

于 2011-12-05T22:12:51.770 回答