سؤال

وأنا أحاول أن إنشاء تطبيق لمحاكاة بعض المجالات الأساسية تتحرك حولها.

والمشكلة أن أواجه هو أنه لا يشبه يتم تعيين البيانات إلى مجموعة خارج بيان الحرف الأول عندما كنت فعلا في حاجة إليها. هل هذه somethingt أن تفعل مع الطريقة لقد أعلنت مجموعة تحتوي على جزيئات.

وأريد إنشاء مجموعة من البنيات التي يمكن الوصول إليها من الأساليب المختلفة لذلك في الجزء العلوي من الملف الخاص بي دون تتضمن عبارات ولقد استخدمت:

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

هل كانت مفيدة؟

المحلول

والمشكلة هي هذا التعريف:

struct particle particles[];

وانها ليست حجز أي الذاكرة، فقط تحديد مجموعة فارغة. تحتاج إلى وضع شيء في تلك الأقواس المربعة. ومن عجب أن كل ما تبذلونه من الكتابة في مناصب مختلفة في هذه المجموعة لا تسبب حوادث segfault ...

هل يمكن أن تحاول مع max_particles، على الرغم من أنني لست متأكدا باستخدام متغير (وإن كان const واحد) هو قانوني في تعريف 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top