gpt4 book ai didi

c++ - ray tracer.exe : 0xC0000005: Access violation writing location 0x709DF990 中 0x010A85FB 处未处理的异常

转载 作者:行者123 更新时间:2023-11-28 07:46:52 34 4
gpt4 key购买 nike

我一直在努力摆脱这个错误,但似乎没有任何效果。我正在使用 OpenGL 在 Visual Studio 2012 中使用 C++ 进行编码。这里我初始化了 rtScene 对象,这个对象的默认构造函数读取一个文件并设置其他数据成员值。当我调用函数 SphereSet() 时会弹出错误,该函数使用数据成员的相应函数设置球体数据成员的值。

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);
}
}
//.............................//
}
};

当函数 rtPointSet 尝试设置 xx, yy, zz 球体中心变量的值。

最佳答案

您正在覆盖循环变量。

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

声明变量接近于它们的使用并且不重用它们是一件好事 - 如果您在循环内声明了 a..q,编译器会捕捉到它你的错误。

关于c++ - ray tracer.exe : 0xC0000005: Access violation writing location 0x709DF990 中 0x010A85FB 处未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14752243/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com