我有一個簡約TRAFIC模擬器:它是蜂窩式自動機至極在四個步驟的工作原理:段錯誤矢量構造
- 加速度(1單元速度的)
- 制動安全(-the數目的空單元格到下一個轎廂) 隨機
- 斷裂,以模擬驅動器的缺陷(-1或-O隨機地),
- mooving(+轎廂細胞的速度)
我在mooving過程中遇到Segfault,在vector<vehicule*>
的初始化過程中,它沒有得到向量的構造函數。 但是,當刪除破壞安全程序,我沒有任何段錯誤。人無我有,如果道路ILS的規模低於16
這裏是最少的代碼來獲得一個bug
#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全球的空間,段錯誤仍那裏。
「我在mooving過程中遇到Segfault,...」我的代碼中找不到mooving()。 – HAL
這是'avancer'功能。 –