我努力使结构的数组,每个结构代表一个天体。
我没有与结构那么多的经验,这就是为什么我决定尝试使用它们替代了一大堆阵列的。 不过,我一直运行到许多不同的错误。 我试图实现,我已经看到了不同的线程和StackOverflow上的技术(比如在C结构的阵列和Ç -初始化结构的数组 ),但是它们并非所有都适用。
对于那些谁看过这一步的详细信息:我不需要任何这是动态的,我知道/事先定义所有内容的大小。 我还需要这是一个全球性的阵列,因为我这个访问中已定义的参数(即GLUT方法)几种不同的方法。
这是我如何定义我的头的结构:
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
我有我定义之前,我定义了结构的内部其他全局变量的列表,以及其中的一个是这样的结构(数组基本上,如果我是在我的雾说得太清楚,下面的一行高于东西以上):
struct body bodies[n];
只要你知道, n
的东西,我已经合法地定义(即#define n 1
)。
我用这个阵列中的几个不同的方法,但消耗一个最简单的和最空间是我的主要的简化形式。 在这里,我初始化所有的变量在每一个结构的,只是设置为某些变量之前,我以某种方式修改它们:
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;
}
我正在面对电流误差是nbody.c:32:13: error: array type has incomplete element type
,其中线32是在那里我使结构的阵列。
最后一个澄清,以头我的意思是上方的空间int main(void)
但在相同*.c
文件。
#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;
}
这工作得很好。 你的问题是不是由路很清楚,所以匹配的上述源代码的布局。
我想你可以写这样的说法了。 我也是一个学生,所以我理解你的斗争。 有点晚了反应,但确定。
#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];
移动
struct body bodies[n];
后
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
其余全部看起来很好。
因此,为了把它放在一起使用malloc()
:
int main(int argc, char** argv) {
typedef struct{
char* firstName;
char* lastName;
int day;
int month;
int year;
}STUDENT;
int numStudents=3;
int x;
STUDENT* students = malloc(numStudents * sizeof *students);
for (x = 0; x < numStudents; x++){
students[x].firstName=(char*)malloc(sizeof(char*));
scanf("%s",students[x].firstName);
students[x].lastName=(char*)malloc(sizeof(char*));
scanf("%s",students[x].lastName);
scanf("%d",&students[x].day);
scanf("%d",&students[x].month);
scanf("%d",&students[x].year);
}
for (x = 0; x < numStudents; x++)
printf("first name: %s, surname: %s, day: %d, month: %d, year: %d\n",students[x].firstName,students[x].lastName,students[x].day,students[x].month,students[x].year);
return (EXIT_SUCCESS);
}
该错误意味着编译器不能结构的阵列的声明之前找到你的结构类型的定义,因为你说你有一个头文件中的结构体的定义和误差在nbody.c
那么你应该检查,如果你正确地包括头文件。 检查您#include
“s,并确保该结构的定义,宣称类型的任何变量之前完成。
使用指针解决方案:
#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;
}
初始化结构的数组的另一种方式是明确地初始化数组成员。 如果没有太多的结构和数组成员此方法非常有用而简单。
使用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}};
要重复,这是一个相当简单明了的解决方案,如果你没有太多的数组元素和大型结构成员,如果你,如你所说,没有兴趣更加动态的方法。 如果结构成员都与名为枚举变量(而不仅仅是像上面的实施例号)初始化这种方法也可以是有用的,由此它给出了代码阅读器的结构的目的,功能的更好的概述及其在某些成员应用。