0

私は両方の方法のさまざまなバリエーションを試しましたが、配列を合計することはできません。これはポインタとして関数に渡され、平均を計算して返す必要があります。

unsigned char calcMean(unsigned char *buffer, int height, int width)
{    
   unsigned char mean, sum=0;
   counter i, k;
   int size;

   size = width*height;

   mean = 0;
   for (i = 0; i < size; i++) {
       sum += buffer[i];
   }

   /*

   for(k=0;k<(width*height);k++)
   {
     mean = mean + *Buffer;
     frameBuffer++;
        printf("%d\n", mean);
   }        
   */   

    return sum;

 }
4

2 に答える 2

2

meanで割っsizeて計算するため、char にすることができます。ただし、それ自体は* 255 (の 8 ビット) までsum高くなる可能性があります。 オーバーフローすることもできます。sizeunsigned charwidth * height

安全のために (32 ビットまたは 64 ビットのマシンで)、次のことを考慮してください。

16 ビット * 16 ビット整数には、32 ビット整数が必要です (ディメンション用)。サイズが 4294967295 までの unsigned char 配列では、合計に 64 ビットが必要になります。

したがって、可能であれば、明示的な整数サイズを使用してください (C99):

uint8_t calcMean(uint8_t *buffer, uint16_t height, uint16_t width)
{    
   uint64_t sum=0;
   size_t i;
   size_t size;//size_t is large enough to store a pointer,
               //so it would have 32 or 64bits on corresponding platforms
               //(see uintptr_t, etc.)

   size = ((size_t)width)*((size_t)height);

   for (i = 0; i < size; i++) {
       sum += buffer[i];
   }

   return sum / size;
}
于 2013-10-16T10:27:44.637 に答える
0

配列のバッファ オーバーフローから身を守るには、buffer[]配列が定義され、値で初期化されていると仮定して、現在持っているメソッドではなく、配列の最初の要素へのポインタと共に配列のサイズを渡しますcalcMean()

への呼び出しcalcMean()は次のとおりです。

uint8_t array_name[3]={1,2,3}; /* Array size and values assumed */
...
calcMean(array_name, sizeof(array_name))

calcMean()定義は次のとおりです。

uint8_t calcMean(uint8_t *buffer, size_t buffer_size)
{
    uint64_t sum=0;
    size_t i;

    for(i = 0; i < buffer_size; i++)
    {
        sum += buffer[i];
    }
    ..../*Do whatever you want if at all needed */

    return (sum / size);
}
于 2013-10-16T10:47:29.560 に答える