-1

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; 
    } 

} 

cevap

1

Her şeyden önce, pushBackIndiv içinde erro için başka bir tane eklemelisiniz. r LangermannPoint veya CurveParams değil. Sorun burada yok gibi görünüyor, ancak bunu eklemenize yardımcı olacaksınız.

İkincisi, operatör [] (int dizini) içinde, bir öğeye erişmeden önce, istenen dizinin aralık dışı verip vermeyeceğini kontrol edin. Bunu individualList.size() ile karşılaştırarak kontrol edebilirsiniz. Ayrıca listedeki öğelere sahip olup olmadığınızı görmek için size() buyrun() öğesini de çağırın.

+0

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

+0

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

0

Pekala, bu yüzden bu hatayı almamın asıl nedeninin benim üzerimde aptalca bir hata olmasından kaynaklandığı ortaya çıktı: Nüfusun büyüklüğünü başlatmayı unuttum, bu yüzden ben hiçbir zaman vektöre eleman eklemedim. yaptığını düşündüm.

Ama neyse ki, ben OH WOW soyut veri tiplerinin bir vektör :)