【问题标题】:Undeclared identifier error in C for loop?C for 循环中未声明的标识符错误?
【发布时间】:2021-11-14 12:06:46
【问题描述】:

我是 C 新手,我正在编写一个程序来计算一个小型数据集的“双通道”方差计算。我得到的值是完全错误的,我认为这是一个特定的 for 循环(如下),这是问题的根源。

float sum_v_f_double = 0.0;
for (int i = 0; i <= size_f; i++)
    sum_v_f_double += (arr_f[i-1]-mean_f)*(arr_f[i-1]-mean_f);

如果我只是尝试打印这个计算的值,它只会打印一次。

输入:

float sum_v_f_double = 0.0;
for (int i = 0; i <= size_f; i++)
    sum_v_f_double += (arr_f[i-1]-mean_f)*(arr_f[i-1]-mean_f);
    printf("%f\n", sum_v_f_double);

输出:

672057216.000000

这显然是一个问题,表明它甚至没有迭代。我不知道为什么,因为我在它上面有一个语法完全相同的循环,它工作正常。完整程序如下:

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

int main(void) {

    float arr_f[5] = {25924.12, 25924.15, 25923.98, 25924.19, 25923.89};
    /* single precision */
    /* double pass */
    float size_f = sizeof(arr_f)/sizeof(*arr_f);
    float sum_f = 0.0;
    for (int i = 0; i <= size_f; i++)
        sum_f += arr_f[i-1];
    
    float mean_f = sum_f/size_f;

    float sum_v_f_double = 0.0;
    for (int i = 0; i <= size_f; i++)
        sum_v_f_double += (arr_f[i-1]-mean_f)*(arr_f[i-1]-mean_f);
        printf("%f\n", sum_v_f_double);

    float var_f_double = (1./(size_f-1.))*sum_v_f_double;
    
    return 0;
}

【问题讨论】:

  • 缩进与 C 编译器完全无关。使用{} 分隔块。
  • i &lt;= size_f 你可能指的是&lt; 而不是&lt;=
  • 如果您想在for 循环中包含多个语句,则需要大括号。 for(...) { /* as much code as you like */ }.
  • 哇!永远不要将索引/限制声明为浮点数。
  • 另外,从 0 开始循环并访问 arr_f[i-1] 是自找麻烦,因为索引 -1 处的元素不存在。

标签: arrays c for-loop sizeof


【解决方案1】:

如果你能正确格式化这段代码sn-p

float sum_v_f_double = 0.0;
for (int i = 0; i <= size_f; i++)
    sum_v_f_double += (arr_f[i-1]-mean_f)*(arr_f[i-1]-mean_f);
    printf("%f\n", sum_v_f_double);

然后你会看到它看起来像

float sum_v_f_double = 0.0;
for (int i = 0; i <= size_f; i++)
    sum_v_f_double += (arr_f[i-1]-mean_f)*(arr_f[i-1]-mean_f);

printf("%f\n", sum_v_f_double);

即for循环只有子语句

sum_v_f_double += (arr_f[i-1]-mean_f)*(arr_f[i-1]-mean_f);

如果您希望 printf 的调用在循环中,您需要使用复合语句,如

float sum_v_f_double = 0.0;
for (int i = 0; i <= size_f; i++)
{
    sum_v_f_double += (arr_f[i-1]-mean_f)*(arr_f[i-1]-mean_f);
    printf("%f\n", sum_v_f_double);
}

请注意,当表达式arr_f[i-1]中的i等于0时,由于访问数组之外​​的内存,这个for循环会调用未定义的行为。

你至少应该这样写

for (int i = 1; i <= size_f; i++)

虽然不清楚您为什么使用表达式 arr_f[i-1] 而不是 arr_f[i] 而不是使用 for 循环

for (int i = 0; i < size_f; i++)

这个循环也存在同样的问题

for (int i = 0; i <= size_f; i++)
    sum_f += arr_f[i-1];

你必须写

for (int i = 1; i <= size_f; i++)
    sum_f += arr_f[i-1];

注意这个声明中的不是 float 类型

float size_f = sizeof(arr_f)/sizeof(*arr_f);

您应该使用无符号整数类型,例如size_t。它是运算符sizeof返回的值的类型。

size_t size_f = sizeof(arr_f)/sizeof(*arr_f);

【讨论】:

  • 我不是在循环开始之前更新为 1 吗?还是 i++ 只发生在迭代之后?
  • 更新发生在for循环之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2020-05-09
  • 2014-02-21
相关资源
最近更新 更多