Как сделать массив структур в Си?


Я пытаюсь сделать массив структур, где каждая структура представляет собой небесное тело, для проблема, что я работаю в моем классе. У меня нет такого большого опыта работы со структурами, поэтому я решил попробовать использовать их вместо целой группы массивов, однако я продолжаю сталкиваться с многочисленными различными ошибками, хотя я пытался реализовать методы, которые я видел в различных потоках и в stackoverflow (например, в массиве структур в C и C-initialize array структур), однако не все из них были применимы, поэтому я не смог полностью скопировать способ сделать это. Просто предупреждаю, прежде чем я покажу вам, что я пытаюсь сделать, я не смогу ответить на комментарии/вопросы/ответы в течение нескольких часов, так как мне нужно ложиться спать, так как я слишком долго не спал, я действительно сожалею об этом, но я действительно устал после напряженного дня и работал над этой проблемой в течение нескольких часов.

дополнительные информация для тех, кто читал это далеко: мне не нужно, чтобы все это было динамичным, я знаю/определяю размер всего заранее. Мне также нужно, чтобы это был глобальный массив (вздохГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ) поскольку я обращаюсь к этому в нескольких различных методах, которые определили аргументы (т. е. методы 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, где я делаю массив структур.

Спасибо за любую помощь, которую вы соблаговолите дать, я обещаю, что я вернусь к вам в самое последнее время, через 12 часов.

последнее уточнение, под заголовком Я имею в виду пространство выше int main(void) но в то же *.файл c.

5 80

5 ответов:

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

это прекрасно работает. ваш вопрос был не очень понятно, кстати, чтобы соответствовать оформлению исходного кода с выше.

движение

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 {
    double p[3];//position
    double v[3];//velocity
    double a[3];//acceleration
    double radius;
    double mass;
}bodies[n];

Итак, чтобы собрать все это вместе с помощью 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 и убедитесь, что определение структуры выполняется перед объявлением любой переменной этого типа.