2009-04-29 8 views
1

私はいくつかの基本的な球体をシミュレートするアプリケーションを構築しようとしています。OpenGLとGLFWを使ってC配列を操作する

私が直面している問題は、データが実際に必要なときに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; 
}; 

私は配列を作成する初期化メソッドを持っていますそして、drawメソッドの内部で、それ

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

答えて

5

のコピーだ問題は、この定義である:

struct particle particles[]; 

それはちょうど空の配列を定義し、任意のメモリを予約していません。これらの角括弧の中に何かを入れる必要があります。このアレイのさまざまなポジションへのあなたの書いたものがセグメンテーションのクラッシュを引き起こしていないのは不思議です...

) 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) 
+0

ありがとうございました。あなたの答えに感謝します。 ありがとうございます! – Malachi