2015-04-04 126 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; 
}