如何在C中生成结构数组?
我试图制作一个结构数组,每个结构代表一个天体 我对结构没有太多的经验,这就是为什么我决定尝试使用它们而不是一大堆数组。然而,我不断地遇到许多不同的错误。我曾尝试在各种线程和StackOverflow(如和)上实现我所看到的技术,但并非所有这些技术都适用 对于那些已经读过这篇文章的人来说,更多的信息是:我不需要任何动态的东西,我事先知道/定义了所有东西的大小。我还需要它是一个全局数组,因为我在几个定义了参数的不同方法中访问它(即GLUT方法) 这就是我在标题中定义结构的方式:如何在C中生成结构数组?,c,arrays,struct,C,Arrays,Struct,我试图制作一个结构数组,每个结构代表一个天体 我对结构没有太多的经验,这就是为什么我决定尝试使用它们而不是一大堆数组。然而,我不断地遇到许多不同的错误。我曾尝试在各种线程和StackOverflow(如和)上实现我所看到的技术,但并非所有这些技术都适用 对于那些已经读过这篇文章的人来说,更多的信息是:我不需要任何动态的东西,我事先知道/定义了所有东西的大小。我还需要它是一个全局数组,因为我在几个定义了参数的不同方法中访问它(即GLUT方法) 这就是我在标题中定义结构的方式: struct bod
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
在定义结构内部之前,我还定义了一系列其他全局变量,其中一个是这个结构的数组(基本上,如果我说得太模糊,下面的一行就在上面):
正如你所知,n
是我合法定义的东西(即#定义n1
)
我在几种不同的方法中使用这个数组,但最简单、占用空间最少的方法是我的main的简化形式。在这里,我初始化了每个结构中的所有变量,只是为了在以某种方式修改变量之前确定这些变量:
int a, b;
for(a = 0; a < n; a++)
{
for(b = 0; b < 3; b++)
{
bodies[a].p[b] = 0;
bodies[a].v[b] = 0;
bodies[a].a[b] = 0;
}
bodies[a].mass = 0;
bodies[a].radius = 1.0;
}
inta,b;
对于(a=0;a
我当前面临的错误是nbody.c:32:13:error:array type具有不完整的元素类型
,其中第32行是我创建结构数组的位置
最后一点澄清,标题是指intmain(void)
上面的空格,但在同一*.c
文件中 移动
struct body bodies[n];
追求
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
所有的休息看起来都很好。#包括
#include<stdio.h>
#define n 3
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
struct body bodies[n];
int main()
{
int a, b;
for(a = 0; a < n; a++)
{
for(b = 0; b < 3; b++)
{
bodies[a].p[b] = 0;
bodies[a].v[b] = 0;
bodies[a].a[b] = 0;
}
bodies[a].mass = 0;
bodies[a].radius = 1.0;
}
return 0;
}
#定义n3
结构体
{
双p[3];//位置
双v[3];//速度
双a[3];//加速度
双半径;
双质量;
};
结构体[n];
int main()
{
INTA,b;
对于(a=0;a
这个很好用。顺便说一下,您的问题不是很清楚,因此请将源代码的布局与上面的匹配。该错误意味着编译器无法在声明结构数组之前找到结构类型的定义,既然您说在头文件中有结构的定义,而错误在
nbody.c
中,那么您应该检查是否正确包含头文件。
检查您的
#include
,并确保在声明该类型的任何变量之前已完成结构的定义。因此,要使用malloc()
将所有变量组合在一起:
int main(int argc,char**argv){
类型定义结构{
char*名字;
char*lastName;
国际日;
整月;
国际年;
}学生;
int numStudents=3;
int x;
学生*students=malloc(numStudents*sizeof*students);
对于(x=0;x
我想你也可以这样写。我也是一名学生,所以我理解你的奋斗。反应有点晚,但还行
#include<stdio.h>
#define n 3
struct {
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
}bodies[n];
#包括
#定义n3
结构{
双p[3];//位置
双v[3];//速度
双a[3];//加速度
双半径;
双质量;
}机构[n];
使用指针的解决方案:
#include<stdio.h>
#include<stdlib.h>
#define n 3
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double *mass;
};
int main()
{
struct body *bodies = (struct body*)malloc(n*sizeof(struct body));
int a, b;
for(a = 0; a < n; a++)
{
for(b = 0; b < 3; b++)
{
bodies[a].p[b] = 0;
bodies[a].v[b] = 0;
bodies[a].a[b] = 0;
}
bodies[a].mass = 0;
bodies[a].radius = 1.0;
}
return 0;
}
#包括
#包括
#定义n3
结构体
{
双p[3];//位置
双v[3];//速度
双a[3];//加速度
双半径;
双倍*质量;
};
int main()
{
结构体*体=(结构体*)malloc(n*sizeof(结构体));
INTA,b;
对于(a=0;a
初始化结构数组的另一种方法是显式初始化数组成员。如果没有太多的结构和数组成员,这种方法非常有用且简单
每次声明结构变量时,请使用typedef
说明符以避免重复使用struct
语句:
typedef struct
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
}Body;
然后声明结构数组。每个元素的初始化与声明一起进行:
Body bodies[n] = {{{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0},
{{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0},
{{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0}};
重复一次,如果您没有太多的数组元素和大型结构成员,并且如您所述,对更动态的方法不感兴趣,那么这是一个非常简单和直接的解决方案。如果使用命名的枚举变量(而不仅仅是上面示例中的数字)初始化结构成员,那么这种方法也很有用,从而使代码读取器更好地了解结构及其成员在某些应用程序中的用途和功能。
typedef struct
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
}Body;
Body bodies[n] = {{{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0},
{{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0},
{{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0}};