C++ push_back(“构造函数”)中未处理的异常;

C++ push_back(“构造函数”)中未处理的异常;,c++,memory,struct,C++,Memory,Struct,编辑:已解决 Win32Project2.exe中0x00F25625处的未处理异常:0xC0000005:访问冲突读取位置0x00000000 这是我的问题。我使用MS Visual Studio Express 2012 此错误由该行抛出 for(int i=1;i<maxLevel;i++) korona.push_back(Level(this,ratio*korona[i-1].l,i)); for(inti=1;il=l; 此->lvl=lvl; 对于(inti=0;

编辑:已解决

Win32Project2.exe中0x00F25625处的未处理异常:0xC0000005:访问冲突读取位置0x00000000

这是我的问题。我使用MS Visual Studio Express 2012

此错误由该行抛出

for(int i=1;i<maxLevel;i++)
    korona.push_back(Level(this,ratio*korona[i-1].l,i));
for(inti=1;il=l;
此->lvl=lvl;
对于(inti=0;icolor[i]=0.0;
这->S=S;
//sticks.resize(S->amount*S->korona[1级].sticks.size());
for(unsigned int i=0;ikorona[lvl-1]。sticks.size();i++){
浮动x=S->korona[1级].棍棒[i].x;
浮动Sx=S->korona[1级].棍棒[i].S->x;
浮动y=S->korona[1级].棍棒[i].y;
浮球Sy=S->korona[1级].棍棒[i].S->y;
浮动z=S->korona[1级].sticks[i].z;
浮动Sz=S->korona[1级].棍棒[i].S->z;
飘浮,舒适;
如果(l!=0){
siny=sqrt((x-Sx)*(x-Sx)+(z-Sz)*(z-Sz))/S->korona[lvl-1].l;
cosy=(y-Sy)/S->korona[1级].l;
}
//else{siny=0;cosy=1;}
浮点数cosx,sinx;
浮动co=cos(S->角度);
浮动si=正弦(S->角度);
如果(sqrt((x-Sx)*(x-Sx)+(z-Sz)*(z-Sz))==0{cosx=1;sinx=0;}
否则{
cosx=(Sx-x)/sqrt((x-Sx)*(x-Sx)+(z-Sz)*(z-Sz));
sinx=(z-Sz)/sqrt((x-Sx)*(x-Sx)+(z-Sz)*(z-Sz));
}
浮式液化天然气=S->比率*此->l;
for(int j=0;jamount;j++){
浮子a=lng*co*cos(360.0f/S->量*j*rad)*舒适lng*si*siny;
浮球b=lng*co*cos(360.0f/S->量*j*rad)*siny+lng*si*cosy;
浮子c=lng*co*sin(360.0f/S->量*j*rad);
棍棒。向后推(棍棒(&(S->korona[1级])。棍棒[i]),
c*sinx+a*cosx+S->korona[1级].棍棒[i].x,
b+S->korona[1级].棍棒[i].y,
c*cosx-a*sinx+S->korona[1级].sticks[i].z];
}
}
}
我至少工作了几个小时。我累了


*编辑:*好的,我做了。一些计算是错误的。///p>当它这样做时,
i
的值是多少?它是否会超出范围?@chris,我猜你推的是第一个元素,然后是第-1个元素,向量(未选中)返回0。“i”在1到20之间,当yoyu在调试器下运行时会发生什么-它应该在异常时停止-而且你应该能够准确地告诉我们哪个i失败,它只抛出那个。但这肯定是向量或其中的某个东西的问题。但是我检查了,它在开始时崩溃了,这意味着当i等于1时,它可以是很小的g在构造函数中编辑错误:我检查了它,我不能用这个构造函数声明级别。它有什么问题。
std::vector <Level> korona;
class Level{
    public:
    float l;
    float color[3];
    char lvl;
    std::vector <Stick> sticks;
    Tree *S;
    Level(Tree *S,float l);
    Level(Tree *S,float l,char lvl);
    ~Level();

    void Change(float h);
};
Level::Level(Tree *S,float l,char lvl){

    this->l=l;
    this->lvl=lvl;
    for(int i=0;i<3;i++)
        this->color[i]=0.0;
    this->S=S;
    //sticks.resize(S->amount*S->korona[lvl-1].sticks.size());
    for(unsigned int i=0;i<S->korona[lvl-1].sticks.size();i++){
        float x=S->korona[lvl-1].sticks[i].x;
        float Sx=S->korona[lvl-1].sticks[i].S->x;
        float y=S->korona[lvl-1].sticks[i].y;
        float Sy=S->korona[lvl-1].sticks[i].S->y;
        float z=S->korona[lvl-1].sticks[i].z;
        float Sz=S->korona[lvl-1].sticks[i].S->z;
        float siny,cosy;
        if(l!=0){
            siny=sqrt((x-Sx)*(x-Sx)+(z-Sz)*(z-Sz))/S->korona[lvl-1].l;
            cosy=(y-Sy)/S->korona[lvl-1].l;
        }
        //else {siny=0;cosy=1;}
        float cosx,sinx;
        float co=cos(S->angle);
        float si=sin(S->angle);
        if(sqrt((x-Sx)*(x-Sx)+(z-Sz)*(z-Sz))==0){cosx=1;sinx=0;}
        else {
            cosx=(Sx-x)/sqrt((x-Sx)*(x-Sx)+(z-Sz)*(z-Sz));
            sinx=(z-Sz)/sqrt((x-Sx)*(x-Sx)+(z-Sz)*(z-Sz));
        }
        float lng=S->ratio*this->l;
        for(int j=0;j<S->amount;j++){
            float a=lng*co*cos(360.0f/S->amount*j*rad)*cosy-lng*si*siny;
            float b=lng*co*cos(360.0f/S->amount*j*rad)*siny+lng*si*cosy;
            float c=lng*co*sin(360.0f/S->amount*j*rad);
            sticks.push_back(Stick(&(S->korona[lvl-1].sticks[i]),
                                                    c*sinx+a*cosx+S->korona[lvl-1].sticks[i].x,
                                                    b+S->korona[lvl-1].sticks[i].y,
                                                    c*cosx-a*sinx+S->korona[lvl-1].sticks[i].z));
        }
    }

}