126

我正在尝试制作一个结构数组,其中每个结构代表一个天体。

我对结构没有太多经验,这就是为什么我决定尝试使用它们而不是一大堆数组的原因。但是,我不断遇到许多不同的错误。我试图实现我在各种线程和 StackOverflow 上看到的技术(例如Array of structs in CC - initialize array of structs),但并非所有这些技术都适用。

对于那些已经读到这里的人的更多信息:我不需要任何这些都是动态的,我事先知道/定义了所有内容的大小。我还需要它是一个全局数组,因为我在几个不同的方法中访问它,这些方法已经定义了参数(即 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)。

我在几种不同的方法中使用这个数组,但最简单且占用空间最少的方法是我的 main.js 的简化形式。在这里,我初始化每个结构中的所有变量,只是为了在我以某种方式修改它们之前设置变量:

  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文件中。

4

7 回答 7

125
#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;
}

这很好用。顺便说一句,您的问题不是很清楚,因此请将源代码的布局与上述内容相匹配。

于 2012-05-06T04:47:51.113 回答
19

初始化结构数组的另一种方法是显式初始化数组成员。如果没有太多的结构和数组成员,这种方法非常有用且简单。

每次声明结构变量时,使用说明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}};

重复一遍,如果您没有太多的数组元素和大型结构成员,并且如您所说,您对更动态的方法不感兴趣,这是一个相当简单和直接的解决方案。如果结构成员使用命名的枚举变量(而不仅仅是上面示例中的数字)进行初始化,这种方法也很有用,这样它可以让代码阅读者更好地了解结构及其成员的目的和功能。应用程序。

于 2019-01-14T10:40:47.483 回答
18

因此,通过使用将它们放在一起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);
}
于 2014-07-02T22:20:30.730 回答
13

我想你也可以这样写。我也是一名学生,所以我理解你的挣扎。回复有点晚,但还可以。

#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];
于 2015-06-08T18:48:35.337 回答
8

移动

struct body bodies[n];

之后

struct body
{
    double p[3];//position
    double v[3];//velocity
    double a[3];//acceleration
    double radius;
    double mass;
};

休息一切看起来都很好。

于 2012-05-06T04:41:26.697 回答
2

使用指针的解决方案:

#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;
}
于 2018-10-16T17:21:16.247 回答
1

该错误意味着编译器在声明结构数组之前无法找到结构类型的定义,因为您说您在头文件中有结构的定义,nbody.c然后错误就在你应该检查你是否正确地包含了头文件。检查您#include的 's 并确保在声明该类型的任何变量之前完成了结构的定义。

于 2012-05-06T04:50:44.400 回答