我有一个极简主义的交通模拟器:它是细胞自动机,分为四个步骤:
我在移动过程中得到了一个Segfault,在vector<vehicule*>
的初始化期间,它没有进入向量的构造函数。
但是当删除破坏安全程序时,我没有任何段错误。如果道路的大小低于16,我没有人。
这是获取错误的最小代码
#include <iostream>
#include <vector>
using namespace std;
struct vehicule
{
vehicule(int v);
int vitesse;//speed
static int vMax;
};
vehicule::vehicule(int v)
{ vitesse=v; }
int vehicule::vMax=5;
void avancer(std::vector<vehicule*>&);//each car mooves their value of speed, of square on the road.
void freinage_secu(std::vector<vehicule*>& );//each car slow down the number of cases betwen their and the next car.
void add_veicule(std::vector<vehicule>&, std::vector<vehicule*>& );
void afficher_route(std::vector<vehicule*>& road)
{
for (vehicule* v:road)
{
if (v==nullptr)
{ cout<<"-"; }
else
{ cout<<"x"; }
}
cout<<"\n";
}
void freinage_secu(vector<vehicule*> &road)
{
int lng=road.size();
int nbV=0;
int last;
int j=0;
for (unsigned int i=0;i<road.size();i++)//compter le nombres de vehicules
{
if(road[i]!=nullptr)
{
nbV++;
}
}
while(road[(j%lng)]==nullptr)//on se place sur le premier evicule
{ j++; }
for (int i=0;i<nbV;i++)
{
last=j;
do
{
j++;
}while(road[j%lng]==nullptr);
if(road[last]->vitesse>(j+lng-last-1)%lng)
{
road[last]->vitesse=(j+lng-last-1)%lng;
}
}
}
void avancer(vector<vehicule*> &road)
{
vector<vehicule*> road2(road.size(),nullptr);//<<<--the bug comme there
for (unsigned int i=0;i<road.size();i++)
{
if (road[i]!=nullptr)
{
road2[(i+road[i]->vitesse)%road.size()]=road[i];
}
}
road=road2;
}
void add_veicule(vector<vehicule> &V, std::vector<vehicule*>& road)
{
unsigned int i=0;
bool overload=1;
V.push_back(vehicule::vMax-vehicule::vMax/2);
while(road[i]!=nullptr&& i<road.size())
{
i++;
}
if (i<road.size())
{
road[i]=&V[V.size()-1];
overload=0;
}
if (overload)
{
V.pop_back();
cout<<"la route est saturée\n";
}
}
/// --------------------------------main
int main()
{
int nbV=16;//dont'bugs if it is lower than 16 (we can overload the road), bugs if <= 16
vector<vehicule> ensembleV;
vector<vehicule*> road(nbV,NULL);//the road is a ring.
string commande;
bool continuer=true;
add_veicule(ensembleV, road);
while(continuer)
{
freinage_secu(road);//slow down
avancer(road);//move foward
afficher_route(road);
cout<<"que voulez vous faire ?\n v\tincrémenter le nombre de vehicules\n quit\tquiter la simulation.\n";
cin>>commande;
if(commande=="v")
{
add_veicule(ensembleV, road);
}
if(commande=="quit")
{
continuer=false;
}
}
return 0;
}
我把道路和ensembleV放到了全球空间,segfault仍然存在。
答案 0 :(得分:1)
此:
vector<vehicule*> road(nbV,NULL);//the road is a ring.
应该是:
vector<vehicule*> road(nbV, nullptr);//the road is a ring.
好像你的编译器欺骗了你...其余的它对我有用,没有错误,或者甚至在nbV = 1
答案 1 :(得分:0)
IMO问题在于这个循环:
while(road[i]!=nullptr && i<road.size())
{
i++;
}
假设道路大小为1,且元素为非空,那么在第二次迭代时,您将首先检查道路[1]是否在边界之外。将其更改为:
while(i<road.size() && road[i]!=nullptr)
另外,你将你的道路矢量指针放入ensembleV元素:
road[i]=&V[V.size()-1];
通过ie调整ensembleV的大小后。 push_back(可能会重新分配向量缓冲区),这些指针在路上不再有效,不确定这是否是导致问题的确切原因。