这是示例代码...但是代码不工作...这里是我的项目的一些代码和屏幕截图。在这段代码中,结果是
红球的位置(3、4)
#include <stdio.h>
char copy_str(char *dest, char *src);
int Print_Obj_Status(struct obj OBJ);
struct obj{
char name[20];
int x, y;
} Ball;
int main(){
Ball.x = 3;
Ball.y = 4;
copy_str(Ball.name, "RED BALL");
Print_Obj_Status(Ball);
return 0;
}
int Print_Obj_Status(struct obj OBJ) {
printf("Location of %s \n", OBJ.name);
printf("( %d, %d ) \n", OBJ.x, OBJ.y);
return 0;
}
char copy_str(char *dest, char *src){
while (*src){
*dest = *src;
src++;
dest++;
}
*dest = '\0';
return 1;
}
3条答案
按热度按时间tf7tbtn21#
函数声明
int Print_Obj_Status(struct obj OBJ);
只在函数声明中声明struct obj
。在声明的末尾,struct obj
对于编译后面的代码来说不再是已知的。这就是第一条消息警告您的。然后这个代码:
定义一个新的
struct obj
类型。因为以前的struct obj
不再是已知的,所以这是一个新类型,即使它具有相同的名称。稍后,当你在
Print_Obj_Status(Ball);
中调用这个函数时,你传递给它的是一个对象Ball
,它的类型是后来的struct obj
,但是这个函数被声明为一个不同的类型,早期的struct obj
。它们在不同的作用域中声明并且是不同的类型。所以编译器会给你一个错误,因为函数没有被传递给声明它的类型。同样的问题也发生在函数定义中;
int Print_Obj_Status(struct obj OBJ)
;函数被定义为具有新类型的参数,该参数与旧类型不同。要解决此问题,请先定义结构,然后在声明
int Print_Obj_Status(struct obj OBJ);
中,范围内已经有一个struct obj
。(没有开始结构定义的跟随X1 M13 N1 X)并且在范围中已经存在X1 M14 N1 X的声明,它引用visible声明而不是创建一个新的声明,然后Print_Obj_Status
将被声明为具有与稍后调用和定义它的类型相同的参数。niwlg2el2#
将结构定义移到函数定义之前:
zaq34kh63#
编译器会抱怨,因为当它到达
Print_Obj_Status
的声明时,struct obj
还没有声明。这个问题很容易解决,方法是将结构声明放在函数声明之前。另外,函数不需要返回值,也不需要声明自己的字符串复制函数。如果包含了头文件string.h
,则可以使用strcpy
: