我是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编译器的实现或执行计划有关。这些只是我的业余假设。
答案 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;
}