Манипулирование массивами C с помощью OpenGL и GLFW
Вопрос
Я пытаюсь создать приложение для имитации перемещения некоторых базовых сфер.
Проблема, с которой я сталкиваюсь, заключается в том, что не похоже, что данные присваиваются массиву вне инструкции init, когда мне это действительно нужно.Связано ли это как-то с тем, как я объявил массив, содержащий частицы?
Я хочу создать массив структур, к которым можно получить доступ с помощью различных методов, поэтому в верхней части моего файла ниже инструкций include, которые я использовал:
struct particle particles[];
// Particle types
enum TYPES { PHOTON, NEUTRINO };
// Represents a 3D point
struct vertex3f
{
float x;
float y;
float z;
};
// Represents a particle
struct particle
{
enum TYPES type;
float radius;
struct vertex3f location;
};
У меня есть метод initialise, который создает массив и присваивает ему частицы
void init(void)
{
// Create a GLU quadrics object
quadric = gluNewQuadric();
struct particle particles[max_particles];
float xm = (width / 2) * -1;
float xp = width / 2;
float ym = (height / 2) * -1;
float yp = height / 2;
int i;
for (i = 0; i < max_particles; i++)
{
struct particle p;
struct vertex3f location;
location.x = randFloat(xm, xp);
location.y = randFloat(ym, yp);
location.z = 0.0f;
p.location = location;
p.radius = 0.3f;
particles[i] = p;
}
}
и затем внутренний метод рисования метод для рисования заданной сцены
// Draws the second stage
void drawSecondStage(void)
{
int i;
for (i = 0; i < max_particles; i++)
{
struct particle p = particles[i];
glPushMatrix();
glTranslatef(p.location.x , p.location.y, p.location.z );
glColor3f( 1.0f, 0.0f, 0.0f );
gluSphere( quadric, 0.3f, 30, 30 );
glPopMatrix();
printf("%f\n", particles[i].location.x);
}
}
вот копия моего кода http://pastebin.com/m131405dc
Решение
Проблема заключается в этом определении:
struct particle particles[];
Это не резервирование какой-либо памяти, просто определение пустого массива.Вам нужно заключить что-то в эти квадратные скобки.Удивительно, что все ваши записи в различные позиции этого массива не привели к сбоям segfault ...
Вы могли бы попробовать с max_particles
, хотя я не уверен, что использую переменную (хотя и const
один) является законным в определении языка Си.
Классическим решением является использование препроцессора, например:
#define MAX_PARTICLES 50
struct particle particles[MAX_PARTICLES];
А затем используйте MAX_PARTICLES в различных циклах.Я предлагаю вместо этого заключить литерал в квадратные скобки:
struct particle particles[50];
А затем писать циклы, подобные этому:
for(i = 0; i < sizeof particles / sizeof *particles; i++)
Это разделение во время компиляции, поэтому оно вам ничего не стоит, и вы повторно используете само определение, чтобы указать количество элементов в массиве, что (IMO) является элегантным.Конечно, вы могли бы пойти каким-то средним путем и определить новый макрос, вот так:
#define MAX_PARTICLES (sizeof particles / sizeof *particles)