【问题标题】:Count function always returns at least 264 CCount 函数总是返回至少 264 C
【发布时间】:2017-11-29 03:52:57
【问题描述】:

我目前正在用 c 编写一个程序,该程序是通过函数做一些方程式。可能要读取的数据最多为 100 万个不包括 0 的两个精度浮点数。当我尝试计算读入数组的数字数量时出现错误,但由于某种原因,我得到了一个默认值264 每次我运行程序。因此,例如,如果不输入任何值,我会得到 264、1 值 265、2 值 266 等等。我想我可以从 count 中减去 264 以获得准确的总数,但我想知道为什么会发生这种情况以及 264 的来源。我在下面附上了到目前为止的代码。谢谢。

#include <stdio.h>
#include <stdlib.h>

#define N 1000000

int count_num(double numbers[]);
double sum(double numbers[]);
double max(double numbers[]);
double min(double numbers[]);
double ar_mean(double numbers[]);
double har_mean(double numbers[]);
double variance(double numbers[]);

int main(void)
{
    double numbers[N];
    int i =0;

    while(scanf("%lf.2",&numbers[i])!=EOF&&i<N)
    {
        i++;
    }

    int count=count_num(numbers);
    printf("Count: %d\n", count);
}

int count_num(double numbers[])
{
    int count=0;
    for(int i=0;i<N;i++)
    {
        if((numbers[i]!=0)&&(numbers[i]!=0.0))
        {
            count++;
        }
    }

    return count;
}

【问题讨论】:

  • 有几个问题,但我认为主要问题是 C 没有将值初始化为默认值(即您的双精度数组未初始化为 0 数组)。这仍然不能完全解释为什么你继续得到 264...
  • 首先,在count_num 中,您总是查看大小为N 的整个数组,而只有该数组中的第一个i 值是有意义的。其余的都是不可预测的垃圾。分析和统计这些垃圾有什么意义?
  • 将一个 3.8 MB 的数组放入堆栈对我来说似乎并不明智。
  • 感谢您的帮助。我以为我必须遍历整个数组,因为我不知道输入的大小只是它的最大大小。我知道我可以在 Java 中使用 ArrayList 之类的东西,但我认为在课堂上的这一点上,我们不应该使用 C 中的东西(例如动态内存分配)来解决这个问题。如果我不需要的话,我认为这将是不浪费内存来保存 100 万个双精度值的最佳方法。

标签: c count


【解决方案1】:

评论者 information_interchange 和 AnT 都是正确的,未初始化的数组是问题的原因——它包含未知值。您需要通过循环并将所有元素设置为 0.0 或使用构造 double numbers[N] = {0.0}; 来初始化数组。

另一个:您的 main 函数不返回 int 但必须根据 ISO/IEC 9899:2011 5.1.2.2.1。

【讨论】:

  • 谢谢!添加 {0.0} 有效,现在我的程序运行顺利。
  • main 不需要有return 语句。很特别。
  • @EricPostpischil 添加了引用以澄清。此规则有例外情况(例如:J.2、J.3.2、J.5.2),但必须记录在案(J.3),因此如果没有任何此类注释,则必须采用默认值。
  • 您的引文是关于定义main。我没有说main 不需要定义。我说它不需要return 声明。 5.1.2.2.3 表示到达终止 main 函数的 } 返回值 0。OP 确实使用 5.1.2.2.1 中所示的类型定义了 main
  • @EricPostpischil a return 在main 中并不隐含,而 5.1.2.2.3 正是如此。 main 函数只是一个普通函数,其中包含一些明确列出的异常,如果您定义一个返回类型而不是 void 的函数,则在 main 的情况下,您必须返回 int 的类型。不再允许将函数void main(){...} 作为入口函数。但是你不必相信我,你可以问stackoverflow的其余部分。我认为正确的标签是language-lawyer 以及相应的语言标签。
猜你喜欢
  • 2011-10-28
  • 2011-04-06
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 2019-11-23
相关资源
最近更新 更多