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计算它。但它sum本身可以高达size* 255 (8bits of unsigned char)。 width * 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 回答