C ++ EXC_BAD_ACCESS что это значит? - PullRequest
       48

C ++ EXC_BAD_ACCESS что это значит?

0 голосов
/ 16 февраля 2019

Я пытаюсь написать свою первую нейронную сеть на C ++, и у меня возникли проблемы с ней.В основном я получаю

ошибка сегментации 11

Поэтому я попытался отладить, и оказалось, что после строки 41 программа останавливается по причине, называемой

EXC_BAD_ACCESS,

что это значит?как я могу обернуться?Из других постов я видел, что ошибка сегментации означает исчерпание стека, что может быть проблемой, потому что, возможно, 30% кода, который я планировал написать

, в любом случае, вот мой код, который я вставил вкомментарий какой была строка 41 (см. комментарий)

 #include <vector>
 #include <iostream>
 #include <cstdlib>
 #include <cassert>
 #include <cmath>
 #include <fstream>
 #include <sstream>

using namespace std;

struct Connection
{
    double w;
    double dw;
};

class Neuron;

typedef vector<Neuron> Layer;
//*************************** class Neuron ***************
class Neuron
{
public:
    Neuron(unsigned numOutput, unsigned MyIndex);
    void setOtpuVal(double Val){m_outputVal = Val; }
    double getOutputval(void) const {return m_outputVal; }
    void feedForward (const Layer &prevLayer);

private:
    static double randomWeight(void) {return (rand()/(RAND_MAX));}
    unsigned  m_MyIndex;
    double m_outputVal;
    vector<Connection> m_outputWeights;

};
void Neuron::feedForward (const Layer &prevLayer){

    double sum = 0.0; //<===================================that's line 40
    for (unsigned i = 0; i < prevLayer.size(); ++i)
    {
        sum += prevLayer[i].getOutputval() * prevLayer[i].m_outputWeights[m_MyIndex].w; 
    }
}



Neuron::Neuron(unsigned numOutput, unsigned MyIndex){

for (unsigned c = 0; c < numOutput; ++c)
    {
        m_outputWeights.push_back(Connection());
        m_outputWeights.back().w = randomWeight();
    }

    m_MyIndex = MyIndex;

}





//*************************** class Net    *********************
class Net{

    public:
        Net (const vector<unsigned> &Topology);
        void feedForward(const vector<double> &Input );
        void backProp (const vector<double> &Target){};
        void getResults(vector<double> &Output) const{}; //const non modifica l'oggetto
    private:
        std::vector<Layer> m_layer; // m_layer []   

};

void Net::feedForward (const vector<double> &Input ) {

//assert(Input.size() == m_layer[0].size()-1);
// assert(inputVals.size() == m_layers[0].size() - 1);

    //feeding
    for (unsigned i = 0; i < Input.size()-1; ++i) {
        m_layer [0] [i].setOtpuVal(Input[i]);

    }

    //foorward propagatin
    for (unsigned i = 0; i < m_layer.size(); ++i)
    {
        Layer &prevLayer = m_layer[i-1];
        for (unsigned j = 0; j < m_layer[i].size(); ++j)
        {
            m_layer[i][j].feedForward(prevLayer);   
        }
    }
}
Net::Net (const vector<unsigned> &Topology){

    unsigned numLayer = Topology.size();
    for (unsigned i = 0; i < numLayer; ++i)
    {
        m_layer.push_back(Layer());
        unsigned numOutput = i == Topology.size() - 1 ? 0 : Topology[i +1]; //inportante!!!!
        for (unsigned j = 0; j <= Topology[i]; ++j)
        {
            m_layer.back().push_back(Neuron(numOutput,j));
            cout<<"made a Neuron"<<endl;
        }
    }

}

int main(int argc, char const *argv[])
{
    ifstream reader("Istruzioni.txt",ios::in);
    std::vector<double> Input;
    std::vector<double> Target;
    std::vector<double> Output;
    std::vector<unsigned> Topology;

    Topology.push_back(3);
    Topology.push_back(2);
    Topology.push_back(1);
    Net MyNet(Topology);


    char letter;
    for (int i = 0; i < 4; ++i)
    {
        reader.get(letter);
        if (i == 3)
        {
            Target.push_back( (float)letter - 48);
        }
        else 
            Input.push_back((float)letter - 48);

    }
    reader.close();



    MyNet.feedForward (Input);
    MyNet.backProp(Target);
    MyNet.getResults(Output);


    return 0;
} 

1 Ответ

0 голосов
/ 16 февраля 2019

Сообщение об ошибке и поведение являются типичными для недопустимого доступа к памяти.Это один из возможных симптомов УБ.Таким образом, то, что можно сказать в дальнейшем, является лишь вероятным объяснением, но ничего точно.

Глядя на код и предполагая, что он был вызван с действительным аргументом prevLayer:

for (unsigned i = 0; i < prevLayer.size(); ++i)
{
    sum += prevLayer[i].getOutputval() * prevLayer[i].m_outputWeights[m_MyIndex].w; 
}

, это с высокой вероятностью доступ за пределы.Поскольку я в принципе в пределах границ, беда приходит m_MyIndex.

Что делать?

  • Проверьте, правильно ли инициализирован этот элемент.
  • Проверьте, является ли его значение положительным и меньше ли оно prevLayer[i].m_outputWeights.size()
  • Если это не помогает решить проблему, это означает, что какое-то другое место в коде испорчено (например, prevLayerуже ссылается на объект, который не существует, или некоторое повреждение памяти произошло раньше и не показывало никаких последствий до этого момента).
...