如何在C中创建一个结构体数组?

xe55xuns  于 2023-03-29  发布在  其他
关注(0)|答案(9)|浏览(108)

我正在尝试创建一个结构体数组,其中每个结构体代表一个天体。
我对结构体没有太多的经验,这就是为什么我决定尝试使用它们而不是一大堆数组。然而,我不断遇到许多不同的错误。我试图实现我在各种线程和Stack Overflow上看到的技术(例如 * Array of structs in C * 和 * Initialize array of structs in 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)。
我在几个不同的方法中使用这个数组,但最简单和最少的空间消耗是我的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;
}

我现在遇到的错误是nbody.c:32:13: error: array type has incomplete element type,其中第32行是我创建结构体数组的地方。
最后一点澄清:header指的是int main(void)上面的空间,但在同一个*.c文件中。

snvhrwxg

snvhrwxg1#

用途:

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

这很好用。顺便说一下,你的问题不是很清楚,所以请将源代码的布局与上面的相匹配。

q9rjltbz

q9rjltbz2#

初始化结构数组的另一种方法是显式初始化数组成员。如果结构和数组成员不太多,这种方法很有用,也很简单。
使用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}};

重复一遍,如果你没有太多的数组元素和大的结构成员,并且如你所述,如果结构成员是用命名的枚举变量初始化的,那么这种方法也很有用(而不仅仅是像上面例子那样的数字),由此它在某些应用中为代码阅读者提供了结构及其构件的目的和功能的更好的概观。

uttx8gqw

uttx8gqw3#

因此,要使用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);
}
rvpgvaaj

rvpgvaaj4#

我想你也可以这样写,我也是学生,所以我理解你的挣扎。

#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];
6mw9ycah

6mw9ycah5#

动起来

struct body bodies[n];

到后面

struct body
{
    double p[3]; // Position
    double v[3]; // Velocity
    double a[3]; // Acceleration
    double radius;
    double mass;
};

其余的看起来都很好。

ki0zmccv

ki0zmccv6#

你可以用创建数字数组的方法来做,但是把元素的值用大括号括起来,就像这样-〉

struct Wrestler studs[count] = {
        {"John", "Cena"},
        {"The", "Undertaker"},
        {"The", "Big Show"},
        {"The", "Rock"},
        {"Triple", "H"},
        {"Scott", "Hall"},
        {"Roman", "Reings"},
        {"Dean", "Ambrose"}};

这里是完整的代码

#include <stdio.h>

struct Wrestler
{
    char firstName[20];
    char secondName[20];
};

void pIntro(struct Wrestler *s)
{
    printf("Hi, I am %s %s.\n", s->firstName, s->secondName);
};

int main(int argc, char const *argv[])
{
#define count 8
    struct Wrestler studs[count] = {
        {"John", "Cena"},
        {"The", "Undertaker"},
        {"The", "Big Show"},
        {"The", "Rock"},
        {"Triple", "H"},
        {"Scott", "Hall"},
        {"Roman", "Reings"},
        {"Dean", "Ambrose"}};

    for (int i = 0; i < count; i++)
    {
        pIntro(&(studs[i]));
    }

    return 0;
}
pod7payv

pod7payv7#

使用指针的解决方案:

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

tkclm6bt8#

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

rur96b6h

rur96b6h9#

试图重建你的程序我明白

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

#define n 9

struct body bodies[n];

int main(void)
{
    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;
    }
}

使用gcc-11 -std=c17 -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds -Wconversion -Wstrict-prototypes -fanalyzer编译时没有错误,所以不清楚为什么会出现问题。
然而,我们仍然有机会通过使用常量struct body来简化它:

int main(void)
{
    static const struct body default_body =
        { {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, 0.0, 1.0 };

    for (unsigned i = 0;  i < n;  ++i) {
        bodies[i] = default_body;
    }
}

相关问题