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;i for(k=0;kmean
可以是一个字符,因为您需要除以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);
}