Я пытаюсь создать массив структур, каждая из которых представляет собой небесное тело.
У меня не так много опыта работы со структурами, поэтому я решил попробовать использовать их вместо целой кучи массивов. Однако я продолжаю сталкиваться с множеством различных ошибок. Я пытался реализовать методы, которые я видел в различных потоках и в StackOverflow (например, Массив структур в C и 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, в которой я создаю массив структур.
И последнее уточнение: под заголовком я подразумеваю пространство выше, int main(void)
но в том же *.c
файле.
struct body bodies[n];
передstruct body {}
декларацией?Ответы:
это отлично работает. кстати, ваш вопрос был не очень ясен, поэтому сопоставьте макет исходного кода с приведенным выше.
источник
Думаю, можно было бы и так написать. Я тоже студент, поэтому понимаю вашу борьбу. Немного запоздалый ответ, но нормально.
источник
Итак, чтобы собрать все вместе, используя
malloc()
:источник
sizeof *students
это то же самое, и не будет ничего плохого, если СТУДЕНТ когда-нибудь изменится.sizeof *students
это размер того, на что указывает , т. е.sizeof(STUDENT)
нетsizeof(STUDENT*)
. Вы делаете именно ту ошибку, от которойptr = malloc(num * sizeof *ptr)
идиома должна защищать. Проверьте это здесь (обратите внимание, что сервер, как и большинство современных ПК, имеет 8-байтовые указатели, поэтому размеры составляют 8 и 32 вместо 4 и 20).шаг
после
Остальное все выглядит нормально.
источник
Другой способ инициализации массива структур - явная инициализация членов массива. Этот подход полезен и прост, если членов структур и массивов не так много.
Используйте
typedef
спецификатор, чтобы избежать повторного использованияstruct
оператора каждый раз, когда вы объявляете структурную переменную:Затем объявите свой массив структур. Инициализация каждого элемента сопровождается объявлением:
Повторюсь, это довольно простое и понятное решение, если у вас не слишком много элементов массива и больших членов структуры и если вы, как вы заявили, не заинтересованы в более динамичном подходе. Этот подход также может быть полезен, если члены структуры инициализируются именованными переменными перечисления (а не только числами, как в примере выше), что дает читателю кода лучший обзор назначения и функции структуры и ее членов в определенных Приложения.
источник
Это означает , что ошибка , что компилятор не может найти определение типа вашей структуры перед объявлением массива структур, так как вы говорите , у вас есть определение структуры в файл заголовок и ошибка в
nbody.c
то вы должны проверить, правильно ли вы включаете файл заголовка.#include
Перед объявлением какой-либо переменной этого типа проверьте свой и убедитесь, что определение структуры выполнено.источник
main
оператором.Решение с использованием указателей:
источник