Bu hatayla gerçekten çok uğraştığım için, bunu düzeltmek için elimden geleni yaptım.C++ vektör segmentasyonu hatası ilk öğeye erişirken hata veriyor
C++ sınıfım için genetik bir algoritma yapıyorum ve bir çok kapsayıcıyı bir kapsayıcıda saklamam gerekiyor, bu nedenle "IndivPtr" örneklerini tutmak için "GenePool" adlı özel bir kapsayıcı sınıf oluşturmayı seçtim "(" Bireysel "için yazılan bir akıllı işaretçi).
Bu kişiler dahili vektöründe depolanır ve öğelerine erişmek için alt simge operatörünü ([]) aşırı yükledim.
Ancak, programım zorlukla çalıştırılıyor, çünkü vektörü elemanlarla doldurduktan sonra, her zaman vektörden FIRST öğesine erişmeye çalışırken bölümleme hatası veriyor ve bir std :: out_of_range istisnası atıyor!
Bu durumda, vektörlerimin elemanlarına böyle bir hataya neden olmadan nasıl erişebileceğimi bilmek istiyorum. Bu simge denir
#include "GenePool.h"
#include "Controller.h"
#include <algorithm>
GenePool::GenePool()
{
// Default empty constructor
individualList.reserve(10000);
}
GenePool::~GenePool()
{
//deleteAll();
}
void GenePool::sortPool()
{
// Sort the vector from greatest to least using GreatertThanSort
// The third parameter is the address of the GreaterThanSort's greater than function for a GreaterThanSort for Individuals
std::sort(individualList.begin(), individualList.end(), &GreaterThanSort::greaterThan);
}
Individual& GenePool::operator[](int index)
{
// Put exception handling here somewhere (a throw statement)
return *individualList.at(index);
}
// Get an individual from the list between index 0 and index size - 1
Individual& GenePool::getRandIndiv()
{
return this->operator[](Controller::getRandNumInRange(0, this->size() - 1));
}
void GenePool::pushBackIndiv(const IndivPtr& indiv)
{
individualList.push_back(indiv);
}
void GenePool::pushBackIndiv(Individual& indiv)
{
Individual * p2Indiv = &indiv;
if(LangermannPoint * pIndivL = dynamic_cast<LangermannPoint*>(p2Indiv))
{
IndivPtr pL(new LangermannPoint(*pIndivL));
individualList.push_back(pL);
}
else if(CurveParams * pIndivC = dynamic_cast<CurveParams*>(p2Indiv))
{
IndivPtr pC(new CurveParams(*pIndivC));
individualList.push_back(pC);
}
}
int GenePool::size() const
{
return individualList.size();
}
void GenePool::clear()
{
if(!individualList.empty())
{
individualList.clear();
}
}
void GenePool::addContentsOf(GenePool& other)
{
for(int i = 0; i < other.size(); ++i)
{
pushBackIndiv(other[i]);
}
}
önce, vektör doldurulur: Burada
// Initialize a population of individuals with randomly generated parameters.
if(getProblemType() == Controller::OPTIMIZATION)
{
for(int i = 0; i < getInitPopSize(); ++i)
{
population.pushBackIndiv(IndivPtr(new LangermannPoint(getRandFloatInRange(0.0f, LangermannPoint::POINT_BOUND),
getRandFloatInRange(0.0f, LangermannPoint::POINT_BOUND))));
}
}
else
{
for(int i = 0; i < getInitPopSize(); ++i)
{
population.pushBackIndiv(IndivPtr(new CurveParams(getRandFloatInRange(-CurveParams::PARAM_BOUND, CurveParams::PARAM_BOUND),
getRandFloatInRange(-CurveParams::PARAM_BOUND, CurveParams::PARAM_BOUND),
getRandFloatInRange(-CurveParams::PARAM_BOUND, CurveParams::PARAM_BOUND),
getRandFloatInRange(-CurveParams::PARAM_BOUND, CurveParams::PARAM_BOUND))));
}
}
hep çöküyor simge operatöre çağırma geçerli:
İşte
GenePool kodudur
bool Controller::terminationCondition()
{
population.sortPool();
// After sorting, the first is the fittest
if(generationCount <= 1)
{
setSolution(population[0]);
return false;
}
else if(getSolution() < population[0] && generationCount < MAX_GEN_COUNT)
{
setSolution(population[0]);
return false;
}
else
{
return true;
}
}
yapmak için bu hatayı araştırmaya ve nasıl yoluyla segmentasyon hataları hakkında tüm öğrendim! Bütün zaman boyunca durumumun karmaşık olduğunu düşündüm; ilk etapta listeye eklenen olayı olmayan unsurlar ortaya çıkıyor! İçgörü için teşekkürler! – gameCoder95
Bu yüzden istisnas yakaladım ve boyutun, çalışma zamanında 0 büyüklüğüne sahip olduğunu görmek için kontrol ettim; bu, boyutuna hiçbir zaman değeri sıfırlamadığım anlamına geliyordu! – gameCoder95