【问题标题】:Structures: Undeclared identifiers结构:未声明的标识符
【发布时间】:2015-04-04 04:56:48
【问题描述】:

我正在尝试在我的程序中使用结构,但我收到一堆错误消息,指出 time1、time2 和 hourDif 是未声明的标识符。我以为我按照你应该的方式声明了这些结构,所以我对问题所在感到困惑。

代码如下:

#include <stdio.h>

struct time1 {
    int seconds1;
    int minutes1;
    int hours1;
};

struct time2 {
    int seconds2;
    int minutes2;
    int hours2;
};

    int timeDif(time1, time2) {
        struct dif {
            int secDif = time2.seconds2 - time1.seconds1;
            int minDif = time2.minutes2 - time1.minutes1;
            int hourDif = time2.hours2 - time1.hours1;
        };

        printf("The difference is %d:%d:%d\n", hourDif, minDif, secDif);
    }



    int main(void) {

        printf("Enter seconds1 (ss)\n");
        scanf("%d", &time1.seconds1);

        printf("Enter minutes1 (mm)\n");
        scanf("%d", &time1.minutes1);

        printf("Enter hours1 (hh)\n");
        scanf("%d", &time1.hours1);

        printf("Enter seconds2 (ss)\n");
        scanf("%d", &time2.seconds2);

        printf("Enter minutes2 (mm)\n");
        scanf("%d", &time2.minutes2);

        printf("Enter hours2 (hh)\n");
        scanf("%d", &time2.hours2);

        timeDif(time1, time2);

    return 0;
}

【问题讨论】:

  • 你似乎真的被困在了最基本的东西上。请自己阅读一些关于 C 的书籍或在线资源。在您的经验阶段,这对您自己来说比使用像 SO 这样的问答网站更有成效。

标签: c struct undeclared-identifier


【解决方案1】:

你不需要定义三个结构,因为它们是相同的类型——时间。你只能定义一个结构time

#include <stdio.h>

struct time {
    int seconds;
    int minutes;
    int hours;
};

void timeDif(struct time time1,struct time time2) {
    struct time diff= {
         time2.seconds - time1.seconds,
         time2.minutes - time1.minutes,
         time2.hours - time1.hours
    };

    printf("The difference is %d:%d:%d\n", diff.hours, diff.minutes, diff.seconds);
}

int main(void) {
    struct time time1,time2,diff;
    printf("Enter seconds1 (ss)\n");
    scanf("%d", &time1.seconds);

    printf("Enter minutes1 (mm)\n");
    scanf("%d", &time1.minutes);

    printf("Enter hours1 (hh)\n");
    scanf("%d", &time1.hours);

    printf("Enter seconds2 (ss)\n");
    scanf("%d", &time2.seconds);

    printf("Enter minutes2 (mm)\n");
    scanf("%d", &time2.minutes);

    printf("Enter hours2 (hh)\n");
    scanf("%d", &time2.hours);

    timeDif(time1, time2);

    return 0;
}

【讨论】:

    【解决方案2】:

    当您引用任何structclass 时,您必须创建objects。你不能直接使用它们,比如scanf("%d", &amp;time1.seconds1);。相反,首先创建一个time1 的对象,然后使用该对象。真的很简单:

    struct time1 t1;    // creates an object t1 of the type time1.
    scanf("%d",&t1.seconds1);
    

    主要原因是:当您定义 struct 时,实际上是在定义 type ,就像 intchar 数据类型一样。你永远不会像scanf("%d",&amp;int); 那样直接使用它们。您总是创建一个int 类型的变量,然后进一步使用它。同样,您为结构创建objects,然后进一步使用它们。

    另外,函数timeDif 也有一些问题,比如它没有返回任何值。由于您的函数在打印结果后似乎不需要返回任何内容,因此将其声明为void。此外,您没有理由在此函数中包含 struct,因为您在同一个函数中打印结果,并且没有在任何地方使用该结构,而且该结构也容易出错。

    这里是修改后的代码:http://ideone.com/uzBnVS

    【讨论】:

      【解决方案3】:

      您的代码中有很多错误。我对你的代码做了一些修改。

      #include <stdio.h>
      
      struct time1 {
          int seconds1;
          int minutes1;
          int hours1;
      };
      
      struct time2 {
          int seconds2;
          int minutes2;
          int hours2;
       };
      
      int timeDif(struct time1 time1, struct time2 time2) { 
          int secDif = time2.seconds2 - time1.seconds1;
          int minDif = time2.minutes2 - time1.minutes1;
          int hourDif = time2.hours2 - time1.hours1;
      
          printf("The difference is %d:%d:%d\n", hourDif, minDif, secDif);
      }
      
      int main(void) {
          //declare the variable to use.
          struct time1 time1;
          struct time2 time2;
          printf("Enter seconds1 (ss)\n");
          scanf("%d", &time1.seconds1);
      
          printf("Enter minutes1 (mm)\n");
          scanf("%d", &time1.minutes1);
      
          printf("Enter hours1 (hh)\n");
          scanf("%d", &time1.hours1);
      
          printf("Enter seconds2 (ss)\n");
          scanf("%d", &time2.seconds2);
      
          printf("Enter minutes2 (mm)\n");
          scanf("%d", &time2.minutes2);
      
          printf("Enter hours2 (hh)\n");
          scanf("%d", &time2.hours2);
      
          timeDif(time1, time2);
      
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        在这个函数定义中

        int timeDif(time1, time2) {
            struct dif {
                int secDif = time2.seconds2 - time1.seconds1;
                int minDif = time2.minutes2 - time1.minutes1;
                int hourDif = time2.hours2 - time1.hours1;
            };
        
            printf("The difference is %d:%d:%d\n", hourDif, minDif, secDif);
        }
        

        编译器将标识符 time1 和 time2 视为对象的名称。但是它们没有定义,因为您没有指定它们的类型。我认为您忘记指定对象的名称并仅指定它们的类型。函数声明可能看起来像

        int timeDif(struct time1 t1, struct time2 t2);
        

        考虑到您必须在结构类型的对象声明中使用带有结构名称的结构标签。

        该函数虽然返回类型为 int,但什么也不返回。它没有任何意义。并且您可能不会在 C 中的定义中初始化结构的数据成员。

        因此这个结构定义

            struct dif {
                int secDif = time2.seconds2 - time1.seconds1;
                int minDif = time2.minutes2 - time1.minutes1;
                int hourDif = time2.hours2 - time1.hours1;
            };
        

        无效。

        函数调用也存在同样的问题

        timeDif(time1, time2);
        

        我认为你的意思是以下

        #include <stdio.h>
        
        struct time 
        {
            int seconds;
            int minutes;
            int hours;
        };
        
        
        struct time_dif 
        {
            int secDif;
            int minDif;
            int hourDif;
        };
        
        struct time_dif timeDif( struct time t1, struct time t2 ) 
        {
            struct time_dif dif = 
            { 
                t2.seconds - t1.seconds,
                t2.minutes - t1.minutes,
                t2.hours   - t1.hours
            };
        
            return dif;
        }
        
        
        
        int main(void) 
        {
            struct time t1, t2;
        
            printf( "Enter hours1 (hh): " );
            scanf( "%d", &t1.hours );
        
            printf( "Enter minutes1 (mm): " );
            scanf( "%d", &t1.minutes );
        
            printf( "Enter seconds1 (ss): " );
            scanf( "%d", &t1.seconds );
        
            printf( "Enter hours2 (hh): " );
            scanf( "%d", &t2.hours );
        
            printf( "Enter minutes2 (mm): " );
            scanf( "%d", &t2.minutes );
        
            printf( "Enter seconds2 (ss): " );
            scanf( "%d", &t2.seconds );
        
        
            struct time_dif dif = timeDif( t1, t2 );
        
            printf( "The difference is %d:%d:%d\n", dif.hourDif, dif.minDif, dif.secDif );
        
            return 0;
        }
        

        考虑到分钟的差异可能是负值。你应该重写函数timeDid,这样它就可以提供两倍的正确差异。

        【讨论】:

        • 在 C90 规则下,int timeDif(time1, time2) 声明了一个函数,该函数接受两个整数参数,称为 time1time2 — 隐式 int。它们与struct time1struct time2 无关。三种结构类型定义也是OTT。
        • @Jonathan Leffler 考虑到错误消息,编译器不使用现在被视为错误的 C90 旧规则。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 2021-06-07
        • 2016-04-09
        相关资源
        最近更新 更多