このエラーを取り除こうとしてきましたが、何もうまくいかないようです。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」というエラーが表示されてコードがクラッシュします。xx
yy
zz