0

このエラーを取り除こうとしてきましたが、何もうまくいかないようです。OpenGL を使用して、Visual Studio 2012 で C++ でコーディングしています。ここでオブジェクトを初期化しrtSceneます。このオブジェクトの既定のコンストラクターはファイルを読み取り、他のデータ メンバー値を設定します。SphereSet()データメンバーのそれぞれの関数を使用して球体のデータメンバーの値を設定する function を呼び出すと、エラーがポップアップします。

class rtPoint
{
    friend class Sphere;
    friend class rtScene;
private:
    double xx,yy,zz;
public:
    rtPoint():xx(0),yy(0),zz(0){cout<<"vi";};
    void rtPointSet(double x,double y,double z)
    {
        xx=x;yy=y;zz=z;
        //cout<<xx<<" "<<yy<<" "<<zz<<"\n";
    }
    void rtPointSet(rtPoint p)
    {
        xx=p.xx;
        yy=p.yy;
        zz=p.zz;
    }
};

class Sphere
{
    friend class rtScene;
private:
    rtPoint center;
    double radius;
    color3 color;
    Material surface;
public:
    Sphere():center(),radius(1),color(),surface(){};
    void SphereSet(double x,double y,double z,double r,
                   double rr,double gg,double bb,double Par,
                   double Pag,double Pab, double Pdr, double Pdg, 
                   double Pdb,double Psr,double Psg,double Psb,double PhCo)
    {
        center.rtPointSet(x,y,z);
        color.set(rr,gg,bb);
        radius=r;
        surface.MaterialSet(Par, Pag, Pab, Pdr, Pdg, Pdb, Psr, Psg, Psb, PhCo);
    }
};

class rtScene
{
private:
    Sphere *Sph_obj;
    //Sphere Sph_obj[3];
    int nS,nL;
    rtCamera CAM;
    rtLight *Lights;
public:
    rtScene(char *fname)
    {
        FILE *fp;
        fp=fopen(fname,"r");
        double a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;
        char ch;

        //.........read camera.........//
        fscanf(fp,"%lf,%lf,%lf,%lf,%lf,%lf\n",&a,&b,&c,&d,&e,&f);                   // 6 values
        this->CAM.rtCameraWindow(a,b,c,d,e,f);
        fscanf(fp,"%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf\n",&a,&b,&c,&d,&e,&f,&g,&h,&i);  // 9 values
        this->CAM.rtCameraSet(a,b,c,d,e,f,g,h,i);
        //.............................//

        //.......read Lights.............//
        fscanf(fp,"%c %d\n",&ch,&nL);
        cout<<nL;
        if(ch=='l')
        {
            this->Lights=new rtLight[nL];
            for(int i=0;i<nL;i++)
            {
                fscanf(fp,"%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf\n",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j,&k,&l); //12 values
                this->Lights[i].rtLightSet(a,b,c,d,e,f,g,h,i,j,k,l);
            }
        }
        //..............................//

        //.....read spheres.............//
        fscanf(fp,"%c %d\n",&ch,&nS);
        cout<<nS;
        if(ch=='s')
        {
            this->Sph_obj=new Sphere[nS];
            //Sph_obj=(class Sphere *) malloc(sizeof(Sphere)*nS);
            for(int i=0;i<nS;i++)
            {
                fscanf(fp,"%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf\n",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j,&k,&l,&m,&n,&o,&p,&q);
                this->Sph_obj[i].SphereSet(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q);
            }
        }
        //.............................//
    }
};

関数が Sphere の中心変数に, ,値rtPointSetを設定しようとすると、「ray tracer.exe の 0x010A85FB で最初のチャンス例外: 0xC0000005: アクセス違反の書き込み場所 0x709DF990」というエラーが表示されてコードがクラッシュします。xxyyzz

4

1 に答える 1

1

ループ変数を上書きしています。

    for(int i=0;i<nS;i++) // Loop over 'i'
    {
        fscanf(fp, [...],&i,[...]);   // Oops!
        this->Sph_obj[i].SphereSet([...]; // Bang!
    }

変数をそれらの使用に近いものとして宣言し、それらを再利用しないことは良いことです-ループ内でa..を宣言した場合q、コンパイラーはそのエラーをキャッチします。

于 2013-02-07T14:49:30.787 に答える