Как сделать массив структур в Си?
Я пытаюсь сделать массив структур, где каждая структура представляет собой небесное тело, для проблема, что я работаю в моем классе. У меня нет такого большого опыта работы со структурами, поэтому я решил попробовать использовать их вместо целой группы массивов, однако я продолжаю сталкиваться с многочисленными различными ошибками, хотя я пытался реализовать методы, которые я видел в различных потоках и в 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 ответов:
#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 и убедитесь, что определение структуры выполняется перед объявлением любой переменной этого типа.