标头函数平均在 C 中给了我错误的结果。如果我调用我在标头中创建的“平均”函数,结果与预期不符

Posted

技术标签:

【中文标题】标头函数平均在 C 中给了我错误的结果。如果我调用我在标头中创建的“平均”函数,结果与预期不符【英文标题】:Header function average gives me wrong result in C. If I call the "average" function which I have created in my header, the result is not as expected 【发布时间】:2022-01-12 16:48:21 【问题描述】:

我在 C 中创建了一个头文件并将其命名为 statistic.h。我创建了一个函数来计算平均值(我将函数称为“平均值”)。但是当我使用公式时: sizeof (list)/sizeof (list[0]) ,结果是错误的。

头文件如下:

 #ifndef STATISTIC_H_INCLUDED
 #define STATISTIC_H_INCLUDED

float average(int list[])
int i;
float sum_elements,mean;

int total =sizeof (list)/sizeof (list[0]);
for (i=0;i<total;i++)
    sum_elements=sum_elements+list[i];
                     
     mean = sum_elements / total;

return mean;


 

 #endif // STATISTIC_H_INCLUDED


//see main code below where I'm trying to call the function I have previously created in the header.

 #include <stdio.h>
 #include "statistic.h"
int main()

int list[]=26,12,16,56,112,24;

float mean=average(list); // I'm calling the average function I created in my header
printf("%f",mean);

return 0;
/*The average is 41.00 but I'm getting 19.00 instead . If I don't use 
the sizeof function and manually declare the variable total=6 (the 
number of element in the list), it gives me the correct result 
(41.00).*/

【问题讨论】:

【参考方案1】:

average 函数中的 list 参数不是数组,而是指针,因此 sizeof 技巧不起作用。

除非它是 sizeof 或一元 &amp; 运算符的操作数,或用于在声明中初始化字符数组的字符串文字,否则 表达式 类型为“N 元素数组T" 将被转换或 "decay" 为 "pointer to T" 类型的表达式,其值将是数组中第一个元素的地址。

当您致电average

float mean=average(list);

表达式list从“int的6元素数组”类型转换为“指向int的指针”,表达式的值与&amp;list[0]相同,那么average实际上是什么接收的是一个指针值,而不是一个数组。

在函数参数声明的上下文中,T a[N]T a[] 都“调整”为 T *a - 所有三个都将 a 声明为指向 T 的指针,而不是 T 的数组.

您必须将数组大小作为单独的参数传递:

float average( int *list, size_t list_size ) 

  ...
  for ( size_t i = 0; i < list_size; i++ ) 
    ...

并将其称为

mean = average( list, sizeof list / sizeof list[0] );

您还需要在average 函数中将sum_elements 显式初始化为0

【讨论】:

非常感谢。 Uni的“教授”无法回答我的问题。我希望有一天我能够回馈我在这里获得的所有帮助。再次感谢约翰。非常感谢。【参考方案2】:

average 中的sizeof (list)/sizeof (list[0]); 不起作用,因为list 在作为参数传递给函数时会衰减为int*。您需要将列表的大小作为参数发送到函数中。

例子:

#include <stddef.h>
#include <stdio.h>

float average(int list[], size_t total)  // send total in as an argument
    float sum_elements = 0;               // note: initialize sum_elements

    for (size_t i = 0; i < total; i++) 
        sum_elements = sum_elements + list[i];
    

    return sum_elements / total;


int main() 
    int list[] = 26, 12, 16, 56, 112, 24;

    // do the size calculation here, where `list` is defined instead:
    float mean = average(list, sizeof list / sizeof *list);
    printf("%f", mean);

    return 0;

Demo

【讨论】:

非常感谢泰德。我已经为此堆积了好几天。你让它看起来如此简单明了。上帝保佑你。 @FabioGenua 很高兴听到这个消息!不客气! @FabioGenua 如果您觉得答案有帮助,请考虑accepting它。

以上是关于标头函数平均在 C 中给了我错误的结果。如果我调用我在标头中创建的“平均”函数,结果与预期不符的主要内容,如果未能解决你的问题,请参考以下文章

你好闪亮的应用程序在反应性表达中给了我错误

尝试更改状态栏样式在 ios 中给了我错误 - React native

当我从线程打印时,它使用 ncurses 在 C 中给了我奇怪的输出

GetPwrCapabilities 在某些计算机上给了我错误的睡眠状态结果。如何获得更准确的结果?

将结果写入 excel B 列

PHP API - Nginx 给了我无效的数据类型标头