Почему this = NULL? Data *d;
d = new Data;
Neuron *n = new Neuron(b);
n->setD(d);
n->t = 2;
Layer *l = new Layer(n);
l->setD(d);
Weight *w = new Weight();
w->setD(d);
Net *q = new Net();
q->setD(d);
Все кроме Data - экзепляры классов. Data это структура.
Все классы наследуют класс DacaCl :class DataCl
{
public:
void setD(Data*);
Data *getD();
int ifgetQuantLayer();
protected:
Data *d;
};double * neural_network_lib::Net::Think(int start = 0)
{
if (start getD()->iQuantLayer) {
this->getD()->pdIn = this->n->pdfActivate(this->w->pdfPrioriti(this->getD()->pdIn, start), start);
this->Think(++start);
}
return this->getD()->pdIn;
}double * neural_network_lib::Weight::pdfPrioriti(double *pdIn, int iCount/*номер слоя*/) //+
{
double *pdOut = new double[this->getD()->piQuantNInLayer[iCount]]; // массив выходных данный с колличествон ячей равным количеству нейронов в слое iCount
double dBuffer; //временные значения
for (int i = 0; i getD()->piQuantNInLayer[iCount]; i++) { // пробегается по нейронам
dBuffer = 0;
for (int j = 0; j getD()->piQuantNInLayer[iCount - 1]; j++) //пробегается по входным данным для i-того нейрона
dBuffer += this->getD()->pppdWeights[iCount-1][i][j]*pdIn[j]; //перемножает значения полученые в iCoint - 1 слое на вес для j-того входа i-того нейрона iCount-го слоя и суммирует их
pdOut[i] = dBuffer; //вписы вает в массив выходных данных
}
return pdOut;;
}double * neural_network_lib::Neuron::pdfActivate(double *pdInData, int iCount)
{
double *pdOutData = new double[iCount];
for (int i = 0; i *(this->dfActivate))(pdInData[i]);
return pdOutData;
}Data * neural_network_lib::DataCl::getD()
{
return this->d;
}
При вызове фугкции Think(); когда выполнение доходит до getD() внутри функции pdfPrioriti, то в getD() this равна NULL
Почему так ?? и как это исправить?

21 Авг 2019 в 07:01
167 +1
0
Ответы
1

Проблема в том, что в вашем коде вы не инициализируете указатель "d" в классах Neuron, Layer, Weight, Net. Поэтому указатель this->d равен NULL в момент вызова метода getD().

Чтобы исправить это, вам нужно инициализировать указатель "d" в конструкторах этих классов. Например, вы можете передавать объект класса Data в конструкторы Neuron, Layer, Weight, Net и сохранять его в указателе "d".

Пример:

Neuron::Neuron(Data *data) {
this->d = data;
}
Layer::Layer(Neuron *neuron, Data *data) {
this->n = neuron;
this->d = data;
}
Weight::Weight(Data *data) {
this->d = data;
}
Net::Net(Data *data) {
this->d = data;
}

Таким образом, у вас не будет проблем с NULL указателем при вызове метода getD() внутри функции pdfPrioriti.

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир