【问题标题】:Use of undeclared identifier in c在 c 中使用未声明的标识符
【发布时间】:2014-09-10 04:33:27
【问题描述】:

我在以下行中收到一个未声明的标识符错误:“printf("%f", new_u[i]);" 这很奇怪,因为我可以在那个 for 循环中打印 i ,它有值。为什么会出现这个错误?

const int MAX = 101;

int main(void) {

    int t = 1; //time
    int m = 0; //number of segments of bar
    int n = 0; //number of time intervals

    double new_u[MAX]; //to store temps currently being converted (array of 101 doubles)
    double old_u[MAX]; //to store temps corresponding to prev time (array of 101 doubles)

    printf("Enter number of segments: ");
    scanf("%d", &m);
    printf("Enter number of time intervals: ");
    scanf("%d", &n);

    double h = (1.0/m); //length of bar segments
    double d = (1.0/n); //length of time interval

    for (int j = 1; j <= n; j++) { //j is which time interval the iteration is on
        int t_j = j * d; //t_j is the actual fraction of a second the iteration is on (i.e. 0.0, 0.2, 0.4...)
        new_u[0] = new_u[m] = 0.0;
        for (int i = 1; i < m; i++)
            new_u[i] = old_u[i] + d/(h*h)*(old_u[i-1] - 2*old_u[i] + old_u[i+1]);
        printf("%f", new_u[i]);
        //I need to finish code by printing new_u values
        //Then copy new_u into old_u for next pass;
    }

}

【问题讨论】:

  • printf("%f", new_u[m]);替换printf("%f", new_u[i]);
  • i 的范围仅在for 循环中。

标签: c undeclared-identifier


【解决方案1】:

由于您没有为内部 for 循环使用任何大括号,因此 i 的值对于该 printf 语句是未知的。在条件和循环语句中,如果没有为它们创建大括号(或创建的块),那么它们只能操作并且范围仅限于声明之后的语句。

for (int i = 1; i < m; i++)
        new_u[i] = old_u[i] + d/(h*h)*(old_u[i-1] - 2*old_u[i] + old_u[i+1]); //i  is known here
        printf("%f", new_u[i]); //i is not available for this

像这样使用大括号

 for (int i = 1; i < m; i++)
 {
    new_u[i] = old_u[i] + d/(h*h)*(old_u[i-1] - 2*old_u[i] + old_u[i+1]);
    printf("%f", new_u[i]);
 }

【讨论】:

  • 顺便说一句,您的缩进样式表明您不打算将 printf 成为 for i... 循环的一部分。
【解决方案2】:

未知标识符是i,而不是new_u;你需要大括号:

for (int i = 1; i < m; i++) {
    new_u[i] = old_u[i] + d/(h*h)*(old_u[i-1] 
               - 2*old_u[i] + old_u[i+1]);
    if (i>1) putchar(' ');
    printf("%f", new_u[i]);
}

在您错误的代码版本中,i 仅通过分配给new_u[i] 可见,而不是通过您的printf 可见

顺便说一句,您可能希望在数字之间留一个空格,就像我对putchar 所做的那样。否则输出可能不可读,例如1.233.45 两个数字 1.233.45

由于您有一个for (int i=1; 循环,i 的范围只是您的for 的(测试、增量和)主体;在您的情况下,该正文是一项单独的任务。

【讨论】:

  • 是的,我知道,这是为什么呢?我显然遗漏了一些简单的东西,但我已经检查过我有值,为什么它是一个未知的标识符
【解决方案3】:

只需在第二个 for 循环中加上一个大括号,也覆盖打印函数...

for (int i = 1; i < m; i++)
 {
    new_u[i] = old_u[i] + d/(h*h)*(old_u[i-1] - 2*old_u[i] + old_u[i+1]);
    printf("%f", new_u[i]);
 }

对您上述评论的回答是

1)。 'i' 是一个未知标识符,因为它现在超出了范围,因为它只有第二个 FOR 循环的范围。

2)。 'i' 具有值,因为您将值放入 FOR 循环中,并且在超出范围后,自动变量也不会被破坏,它会一直保留在那里,直到在执行时被某个新变量覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多