在gcc ver 4.6.3中通过值将Struct作为参数传递给函数时出错

时间:2014-03-12 22:01:08

标签: c linux gcc

我是C编程的新手,我正在学习通过值将结构作为参数传递给函数(作为我课程的一部分)。我在Ubuntu Linux 12.04LTS上使用gcc ver 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编译器的实现或执行计划有关。这些只是我的业余假设。

2 个答案:

答案 0 :(得分:2)

当C编译器遇到来自get_data的{​​{1}}调用时,它不知道返回类型是什么(因为它既没有看到函数声明也没看到函数定义),所以它假设main。这会为您提供第一个警告,因为int与作业中的salary不兼容。编译器继续前进,现在认为int返回get_data,然后在遇到int的实际定义时抱怨。

您应该在get_data之前添加函数原型,或者确保在调用之前始终定义函数(通过在源代码中重新排列它们的顺序)。

最后的警告是因为带有main说明符的scanf期待%s,但您提供了char*类型的内容。传递数组时,请离开char (*)[30]

只需在main之前添加以下内容:

&

答案 1 :(得分:-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;
}