Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-使用指针的数组和_C_Arrays_Pointers_Sum - Fatal编程技术网

C-使用指针的数组和

C-使用指针的数组和,c,arrays,pointers,sum,C,Arrays,Pointers,Sum,我尝试了这两种方法的许多不同变体,但无法使其对数组求和。它作为指针传递到函数中,需要计算平均值并返回 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 < siz

我尝试了这两种方法的许多不同变体,但无法使其对数组求和。它作为指针传递到函数中,需要计算平均值并返回

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;

 }
unsigned char calcMean(unsigned char*buffer,int-height,int-width)
{    
无符号字符平均值,和=0;
计数器i,k;
整数大小;
尺寸=宽度*高度;
平均值=0;
对于(i=0;ifor(k=0;k
mean
可以是一个字符,因为您需要除以
size
来计算它。但是
sum
本身可以高达
size
*255(8位
无符号字符
)。
width*height
也会溢出

为了安全起见(在32或64位机器上),考虑这个问题:

16位*16位整数需要32位整数(用于维度)。 大小高达4294967295的无符号字符数组需要64位的和

因此,如果可能,请使用显式整数大小(C99):

uint8\u t计算平均值(uint8\u t*缓冲区、uint16\u t高度、uint16\u t宽度)
{    
uint64_t sum=0;
尺寸i;
size\u t size;//size\u t足够大,可以存储指针,
//因此,在相应的平台上,它将有32或64位
//(参见uintptr\t等)
尺寸=((尺寸)宽度)*((尺寸)高度);
对于(i=0;i
为防止
缓冲区[]
数组的缓冲区溢出,假设已使用值定义并初始化了数组,请将数组大小与指向数组第一个元素的指针一起传递给
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);
}
uint8\u t计算平均值(uint8\u t*buffer,size\u t buffer\u size)
{
uint64_t sum=0;
尺寸i;
对于(i=0;i <代码>和<代码>可能超出了代码>未签名char < /代码>类型。将声明视为更大数据类型的变量,如<代码> int >代码>。您得到了什么输出?在<代码>缓冲区[I]中的值是什么?
当你在调试器下运行它时?缓冲区是如何填充的?当你运行这段代码时会发生什么?你为什么尝试对字符而不是整数求和?你尝试过调试器吗?@sgar91它必须是那种类型,mean的输出为零,sum的输出为零对不起,没有明确定义这个问题,我不知道如何对arra的元素求和你是对的,我应该提到
size\u t
。当在64位模式下构建时,
size\u t
将超过这些要求,但这不会有太大区别。但是,对于
宽度和
高度,仍然可以使用
uint16\u t
,只是为了自我解释代码。
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);
}