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 は、ポインターの非常に小さな値または範囲です...

ただし、少なくとも関数全体と関連する定義/宣言 (「バッファー」とは何ですか? なぜ 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++) {...}

pixel と pix は char* です。bmax は unsigned int です。キャストが臭い。私は次のようなものを期待します:

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 に答える