簡體   English   中英

C - 使用指針的數組之和

[英]C - Sum of Array using pointers

我已經嘗試了兩種方式的許多不同變體,並且無法將它與數組相加。 它作為指針傳遞給函數,需要計算均值並返回。

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;

 }

mean可以是char,因為你會按size除以計算它。 sum本身可以高達size * 255(8位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;
}

為了防止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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM