2014-03-12 39 views
0

我是C編程的新手,我正在學習通過值傳遞一個結構作爲參數作爲參數(作爲我的課程的一部分) 。我用gcc 4.6.3版本在Ubuntu Linux 12.04LTS 以下是這似乎邏輯和語法正確的源代碼(對我來說),但在編譯時我得到的錯誤:通過作爲參數傳遞結構作爲參數錯誤在海灣合作委員會版本4.6.3

#include<stdio.h> 

struct sal { 
    char name[30]; 
    int no_of_days_worked; 
    int daily_wage; 
}; 
typedef struct sal Sal; 

void main() 
{ 
    Sal salary; 
    int amount_payable; 
    salary=get_data(salary);   //Passing struct as function arguments 
    printf("\nThe name of the Employee is %s",salary.name); 
    printf("\nNumber of days worked is %d",salary.no_of_days_worked); 
    printf("\nThe daily wage of the employees is %d",salary.daily_wage); 
    amount_payable=wages(salary); 
    printf("\nThe amount payable to %s is %d",salary.name,amount_payable); 
} 

Sal get_data(Sal income) 
{ 
    printf("\nEnter the name of the Employee: \n"); 
    scanf("%s",&income.name); 
    printf("\nEnter the number of days worked:\n"); 
    scanf("%d",&income.no_of_days_worked); 
    printf("\nEnter the employee daily wages:\n"); 
    scanf("%d",&income.daily_wage); 
    return(income);        //Return back a struct data type 
} 

int wages(Sal x) 
{ 
    int total_salary; 
    total_salary=x.no_of_days_worked*x.daily_wage; 
    return(total_salary); 
} 

在編譯代碼我得到以下錯誤:

struct_to_function.c: In function ‘main’: 
struct_to_function.c:15:7: error: incompatible types when assigning to type ‘Sal’ from type ‘int’ 
struct_to_function.c: At top level: 
struct_to_function.c:22:5: error: conflicting types for ‘get_data’ 
struct_to_function.c:15:8: note: previous implicit declaration of ‘get_data’ was here 
struct_to_function.c: In function ‘get_data’: 
struct_to_function.c:25:1: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Wformat] 

我認爲它的編譯器是否使用堆棧或寄存器有一些事情與gcc編譯器執行或執行計劃。再次,這些只是我的業餘假設。

+0

人間 「和income.name);」最好是「scanf(」%s「,income.name);」因爲數組本身衰減爲一個指向其第一個元素的指針,即char *。儘管結果應該具有相同的數值,即獲得數組的地址,但是嚴格地說是類型錯誤,即scanf應該起作用。只是不要增加指針;-)。 –

回答

2

當C編譯器遇到從mainget_data通話,它不知道返回類型是什麼(因爲它沒有看到一個函數聲明,也沒有一個函數的定義),所以它假定int。這給你第一個警告,因爲salary與作業中的int不兼容。編譯器繼續前進,現在認爲get_data返回int,然後它在遇到get_data的實際定義時發出抱怨。

您應該在main之前添加一個函數原型,或者確保函數在調用之前總是被定義的(通過重新安排它們在源代碼中的順序)。

最後的警告是因爲scanf%s符期待一個char*,但你給它​​類型的東西。傳遞數組時,請離開&

前主只需添加以下內容:

Sal get_data(Sal income); 
int wages(Sal x); 
+0

實際上,編譯器假定get_data()的**返回值是int。 (這是分配給工資,當然不起作用。) –

+0

@PeterSchneider我站在更正,你是對的 – pat

+0

我已經把函數原型聲明放在main()之前,現在程序編譯和運行完美。我很愚蠢,不去想如何以線性方式執行指令/代碼。我正在運行學習/示範程序;否則按照學術論壇會員在這裏指出的那樣按價值傳遞結構並不是一個好習慣。謝謝大家尤其是Peter Schneider對雄辯解釋錯誤的原因。 – Nadeem

-1

你有一個指針傳遞到結構。當你嘗試傳遞結構本身時,C編譯器試圖複製它,但它不知道如何做(你需要使用C++來定義它),所以這是一個錯誤。

您在使用它們之前沒有聲明函數,因此編譯器爲您創建了它自己的默認定義。你必須在引用它之前聲明一個函數。

此外,通過值傳遞結構然後修改並將其傳回的做法很糟糕。最好將指針傳遞給要修改的對象。

所以:

int wages(Sal x); 
void get_data(Sal* income); 
void main() 
{ 
    Sal salary; 
    int amount_payable; 
    get_data(&salary);   //Passing struct as function arguments 
    // print stuff 
    amount_payable = wages(salary); 
    // print stuff 
} 
void get_data(Sal* income) 
{ 
    printf("\nEnter the name of the Employee: \n"); 
    scanf("%s", income->name); 
    printf("\nEnter the number of days worked:\n"); 
    scanf("%d", &(income->no_of_days_worked)); 
    printf("\nEnter the employee daily wages:\n"); 
    scanf("%d", &(income->daily_wage)); 
} 
int wages(Sal x) 
{ 
    int total_salary; 
    total_salary = x.no_of_days_worked * x.daily_wage; 
    return total_salary; 
} 
被他人 「的scanf(」 %s的言論
+1

錯了。 C編譯器可以按值傳遞結構。你只需要在給他們打電話之前給它原型。 – pat

+0

@pat您不能將結構返回並將其分配給已分配的結構。將數據讀入以這種方式傳遞的結構是不好的做法。 – JonS

+1

也是不正確的。您可以按值返回結構,並覆蓋在呼叫站點分配的結構。 – pat

相關問題