c# 为什么我的结构代码不能很好地工作?

ztigrdn8  于 2023-01-07  发布在  C#
关注(0)|答案(3)|浏览(190)

这是示例代码...但是代码不工作...这里是我的项目的一些代码和屏幕截图。在这段代码中,结果是
红球的位置(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;
  }

tf7tbtn2

tf7tbtn21#

函数声明int Print_Obj_Status(struct obj OBJ);只在函数声明中声明struct obj。在声明的末尾,struct obj对于编译后面的代码来说不再是已知的。这就是第一条消息警告您的。
然后这个代码:

struct obj{
  char name[20];
  int x, y;
  } Ball;

定义一个新的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将被声明为具有与稍后调用和定义它的类型相同的参数。

niwlg2el

niwlg2el2#

将结构定义移到函数定义之前:

struct obj{
    char name[20];
    int x, y;
} Ball;

int Print_Obj_Status(struct obj OBJ);
zaq34kh6

zaq34kh63#

编译器会抱怨,因为当它到达Print_Obj_Status的声明时,struct obj还没有声明。这个问题很容易解决,方法是将结构声明放在函数声明之前。另外,函数不需要返回值,也不需要声明自己的字符串复制函数。如果包含了头文件string.h,则可以使用strcpy

#include <stdio.h>
#include <string.h>

struct obj {
    char name[20];
    int x, y;
} Ball;

void Print_Obj_Status(struct obj OBJ)
{
    printf("Location of %s \n", OBJ.name);
    printf("( %d, %d ) \n", OBJ.x, OBJ.y);
}

int main(void)
{
    Ball.x = 3;
    Ball.y = 4;
    strcpy(Ball.name, "RED BALL");
    Print_Obj_Status(Ball);
    return 0;
}

相关问题