Управление массивами C с помощью OpenGL и GLFW - PullRequest
1 голос
/ 29 апреля 2009

Я пытаюсь создать приложение для имитации некоторых базовых сфер, движущихся вокруг.

Проблема, с которой я сталкиваюсь, заключается в том, что не похоже, что данные присваиваются массиву вне оператора init, когда мне это действительно нужно. Это как-то связано с тем, как я объявил массив, содержащий частицы.

Я хочу создать массив структур, к которым можно получить доступ различными способами, поэтому в верхней части моего файла ниже операторов включения, которые я использовал:

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

У меня есть метод инициализации, который создает массив и присваивает ему частицы

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

1 Ответ

5 голосов
/ 29 апреля 2009

Проблема заключается в следующем определении:

struct particle particles[];

Это не резервирование какой-либо памяти, а определение пустого массива. Вы должны поместить что-то в эти квадратные скобки. Удивительно, что все ваши записи в различные позиции в этом массиве не привели к сбоям segfault ...

Вы можете попробовать с max_particles, хотя я не уверен, что использование переменной (хотя const one) допустимо в определении C.

Классическим решением является использование препроцессора, например:

#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)
...