我多次尝试修复错误" Incomplete Definition of Type of struct *
,请您帮助我找出问题并修复它?
对此有何建议?
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
struct mypoint;
typedef struct mypoint {
int x;
int y;
};
void setRandomPoint(struct mypoint *a, int min, int max)
{
do {
a->x = rand();
} while (a->x > max || a->x < min);
do
{
a->y = rand();
} while (a->y > max || a->y < min);
}
int main()
{
struct myPoint point;
int min = 0, max = 0;
int i;
srand(time(NULL));
while (min >= max)
{
printf("Enter min:");
scanf("%d", &min);
printf("Enter max:");
scanf("%d", &max);
}
for (i = 0; i<5; i++)
{
setRandomPoint(&point, min, max);
printf("%d. point.x=%d, point.y=%d\n", i + 1, point.x, point.y);
}
printf("Finish.\n");
return 0;
}
请任何人都可以帮助我PLZ?
答案 0 :(得分:3)
为typedef
&#39; ed结构添加名称:
typedef struct mypoint {
int x;
int y;
} myPoint;
从你的陈述来看:
struct myPoint point;
我想你要给的名字是myPoint
。现在,您忘记给它命名,因此myPoint
不存在。
还请注意 声明:
struct myPoint point;
即使您为typedef
&#39; ed结构命名,您现在使用的也是错误的。提供姓名后,您可以使用以下方式访问struct
myPoint point;
或:
struct mypoint point;
答案 1 :(得分:1)
struct mypoint;
这是一份前瞻性声明。您告诉编译器存在一个名为mypoint
的结构,但是现在编译器无法知道该结构包含什么。这是不完整类型的结构,这意味着稍后您必须使用完整定义来完成它。
typedef struct mypoint {
int x;
int y;
};
这不是定义结构的正确方法。如果省略typedef,那么你将得到一个用“{tag”mypoint
定义的结构。这就足以使用所述结构,即使你必须在任何地方都将它称为struct mypoint
。
在制作新的类型时,您应该只使用typedef
。这种类型需要一个类型名称,最后输入。上面的代码片段缺少类型名称,这就是编译器错误的原因。
正确的代码:
typedef struct mypoint { // struct "tag"
int x;
int y;
} mypoint; // type name
请注意,struct标记和类型名称存在于不同的名称空间中,因此它们实际上可以具有相同的名称。大多数情况下,这两种情况并非同时使用。常见的样式是使用typedef struct {...} mypoint;
或struct mypoint {...};
。
对于什么是首选,有一种风格的战争。 Linux阵营更喜欢后一种风格,因此在代码中的任何地方都输出struct
。虽然其他人都喜欢使用typedef。支持或反对任何一种风格的论据都是主观的,没有明显的正确与错误。
答案 2 :(得分:0)
在typedefed struct
中,您忘记了名称myPoint
typedef struct mypoint {
...
...
} myPoint;
此外,稍后仅使用myPoint point;
作为结构已定义myPoint
。因此无需再次使用struct
此外,您可以删除语句struct mypoint;