Как вы создаете массив структур в C?
Я пытаюсь создать массив структур, где каждая структура представляет собой небесное тело для проблемы, над которой я работаю в своем классе. У меня нет такого большого опыта работы с структурами, поэтому я решил попытаться использовать их вместо целого ряда массивов, однако я постоянно сталкиваюсь с множеством различных ошибок, хотя я пытался реализовать методы что я видел в разных потоках и в stackoverflow (например, в Массив структур в C и C - инициализировать массив structs), однако не все из них применимы, поэтому я не смог полностью скопировать способ сделать это. Прежде чем я покажу вам, что я пытаюсь сделать, я не буду отвечать на комментарии/info/ответы в течение нескольких часов, поскольку мне нужно ложиться спать, так как я просыпаюсь слишком долго, Я действительно сожалею об этом, но я действительно устал после напряженного дня и уже несколько часов работал над этой проблемой.
Дополнительная информация для тех, кто прочитал это: мне не нужно, чтобы это было динамично, я знаю/определяю размер всего заранее. Мне также нужно, чтобы это был глобальный массив (gasp GLOBAL VARIABLES), поскольку я обращаюсь к нему несколькими способами, которые имеют определенные аргументы (т.е. Методы 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
).
Я использую этот массив несколькими способами, но наиболее простым и наименее затратным пространством является упрощенная форма моей основной, где я инициализирую все переменные в каждой из структур, просто чтобы установить переменные для определенных, прежде чем изменять их в некотором роде:
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 файле.
Ответы
Ответ 1
#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;
}
это отлично работает. ваш вопрос был не очень ясным, так что сопоставьте макет исходного кода с приведенным выше.
Ответ 2
переместить
struct body bodies[n];
после
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
Остальное все выглядит нормально.
Ответ 3
Я думаю, вы тоже могли бы написать это. Я тоже ученик, поэтому понимаю вашу борьбу. Немного поздний ответ, но нормально.
#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];
Ответ 4
Итак, чтобы собрать все это, используя 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);
}
Ответ 5
Эта ошибка означает, что компилятор не может найти определение типа вашей структуры перед объявлением массива структур, поскольку вы говорите, что у вас есть определение структуры в файле заголовка и ошибка находится в nbody.c
, тогда вы должны проверить правильность ввода заголовочного файла.
Проверьте #include
и убедитесь, что определение структуры выполнено до объявления любой переменной этого типа.