0

再帰バージョンをエミュレートする反復アルゴリズムを使用して、シェルピンスキーのガスケットを実装しようとしています。

セグメンテーション違反が発生しています。おそらく関数はNULLポインターを逆参照しようとしていますが、見つかりません。問題は、elseではなくifブロックにあるはずです。ifブロックをスキップすれば正常に動作しているからです。ご協力いただきありがとうございます。

GLfloat points[18*(3^GENCOUNT)];

std::stack<Pyramid *> Q;

// initial Pyramid
Q.push(new Pyramid(Vec3(0.0f, 0.4f, 0.0f),
                    Vec3(-0.4f, -0.4f, 0.4f),
                    Vec3(0.4f, -0.4f, 0.4f),
                    Vec3(0.4f, -0.4f, -0.4f),
                    Vec3(-0.4f, -0.4f, -0.4f), 0));

int i = 0;
while(!Q.empty())
{
    Pyramid *topPyr = Q.top();
    Q.pop();

    if(topPyr->mGeneration < GENCOUNT)
    {
        Vec3 baseVec3 = (((topPyr->mV2+topPyr->mV3)/2.0f) + ((topPyr->mV4+topPyr->mV5)/2.0f)) / 2.0f;

        Q.push(new Pyramid(topPyr->mV1,
                           (topPyr->mV1+topPyr->mV2)/2.0f,
                           (topPyr->mV1+topPyr->mV3)/2.0f,
                           (topPyr->mV1+topPyr->mV4)/2.0f,
                           (topPyr->mV1+topPyr->mV5)/2.0f, topPyr->mGeneration+1));
        Q.push(new Pyramid((topPyr->mV1+topPyr->mV2)/2.0f,
                           topPyr->mV2,
                           (topPyr->mV2+topPyr->mV3)/2.0f,
                           baseVec3,
                           (topPyr->mV2+topPyr->mV5)/2.0f, topPyr->mGeneration+1));
        Q.push(new Pyramid((topPyr->mV1+topPyr->mV3)/2.0f,
                           (topPyr->mV2+topPyr->mV3)/2.0f,
                           topPyr->mV3,
                           (topPyr->mV3+topPyr->mV4)/2.0f,
                           baseVec3, topPyr->mGeneration+1));
        Q.push(new Pyramid((topPyr->mV1+topPyr->mV4)/2.0f,
                           baseVec3,
                           (topPyr->mV3+topPyr->mV4)/2.0f,
                           topPyr->mV4,
                           (topPyr->mV4+topPyr->mV5)/2.0f, topPyr->mGeneration+1));
        Q.push(new Pyramid((topPyr->mV1+topPyr->mV5)/2.0f,
                           (topPyr->mV2+topPyr->mV5)/2.0f,
                           baseVec3,
                           (topPyr->mV4+topPyr->mV5)/2.0f,
                           topPyr->mV5, topPyr->mGeneration+1));
    }
    else
    {
        memcpy(points+i, topPyr->mV1.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV2.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV3.mVec3, sizeof(GLfloat)*3);i+=3;

        memcpy(points+i, topPyr->mV1.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV3.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV4.mVec3, sizeof(GLfloat)*3);i+=3;

        memcpy(points+i, topPyr->mV1.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV4.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV5.mVec3, sizeof(GLfloat)*3);i+=3;

        memcpy(points+i, topPyr->mV1.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV5.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV2.mVec3, sizeof(GLfloat)*3);i+=3;

        memcpy(points+i, topPyr->mV2.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV3.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV4.mVec3, sizeof(GLfloat)*3);i+=3;

        memcpy(points+i, topPyr->mV4.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV5.mVec3, sizeof(GLfloat)*3);i+=3;
        memcpy(points+i, topPyr->mV2.mVec3, sizeof(GLfloat)*3);i+=3;
    }
    delete topPyr;
}
4

1 に答える 1

0

私のC++は非常に錆びていますが、演算子のオーバーロードが発生していないと仮定すると、そうではありません

3^GENCOUNT

最初の行で「3とGENCOUNTの間のビット単位のXOR」を意味しますか?べき乗、つまりGENCOUNTの3乗であることを意味していると確信しています。

于 2012-08-11T18:40:37.380 に答える