2015-04-04 122 views
0

我试图在我的程序中使用结构,并收到一堆错误消息,指出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; 
} 
+0

你真的好像被困在最基本的东西里。请让你自己阅读一些关于C的书籍或在线资源。在你的体验阶段,使用像SO这样的Q&A网站,这对你自己来说会更有成效。 – 2015-04-04 07:09:26

回答

0

在这个函数定义

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); 
} 

编译consideres标识符时间1和时间2的对象的名称。但是他们没有定义,因为你没有指定他们的类型。我认为你忘了指定对象的名称并只指定它们的类型。该函数的声明可能看起来像

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这样的方式,它会提供两次正确的差异。

+0

在C90规则下,'int timeDif(time1,time2)'声明了一个函数,它接受两个整型参数,分别叫'time1'和'time2' - 隐式'int'。它们与'struct time1'或'struct time2'没有关系。三种结构类型定义也是OTT。 – 2015-04-04 06:05:12

+0

@Jonathan Leffler考虑到错误消息,编译器不会使用现在被认为是错误的旧C90规则。 – 2015-04-04 07:34:02

0

你的代码有一堆错误。我在你的代码中做了一些修改。

#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; 
} 
0

每当你指的是任何structclass,你必须创建objects。您不能直接使用它们,例如scanf("%d", &time1.seconds1);。相反,首先创建一个对象time1,然后使用该对象。这是非常简单的:

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

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

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

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

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; 
}