Как инициализировать массив структур другой структурой?

Здравствуйте, я пишу алгоритм обратного распространения в C ++, он состоит из 1 входного слоя 1 скрытый слой и 1 выходной слой.
Мне интересно, как инициализировать мой inputlayer, hiddenlayer и outputlayer.

Вот что я получил:

struct Neuron {
double activation;
double bias;
double *incomingWeights;
};

struct Network {
double *targetLayer;
Neuron *inputLayer;
Neuron *hiddenLayer;
Neuron *outputLayer;
};

ann.inputLayer = malloc(din * sizeof * Neuron); //ERROR
for (int i = 0; i < din; i++) {
ann.inputLayer[i].activation = 0;
ann.inputLayer[i].bias = 0;
ann.inputLayer[i].incomingWeights = NULL;
}

ann.outputLayer = malloc(dout * sizeof * Neuron); //ERROR
for (int i = 0; i < dout; i++) {
ann.outputLayer[i].activation = 0;
ann.outputLayer[i].bias = 0;
ann.outputLayer[i].incomingWeights = new double[dhid];
}

din представляет количество нейронов в моем входном слое.
dhid представляет количество нейронов в моем скрытом слое.
dout представляет количество нейронов в моем выходном слое.
я не удосужился показать инициализацию моего скрытого слоя, потому что это не важно
благодарю вас

я написал // ОШИБКА в строках, где отображаются ошибки в соответствии с моей IDE (netbeans)

-2

Решение

Во-первых, вы никогда не хотите делать инициализации по умолчанию в вызывающем коде, вы можете создать конструктор для вашей структуры и сделать это там:

struct Neuron {
Neuron() : activation(0.0), bias(0.0), incomingWeights(0) {}
double activation;
double bias;
double *incomingWeights;
};

Тогда (так как это C ++)

for (int i = 0; i < din; i++) {
ann.inputLayer[i] = new Neuron[din];

Вы должны использовать new над malloc в C ++, хотя если вам когда-либо нужно malloc Ваше заявление должно быть исправлено, чтобы:

ann.inputLayer = (Neuron*)malloc(din * sizeof(Neuron));
2

Другие решения

Не использовать malloc в C ++.

Как минимальное изменение того, что у вас есть, изменить это:

ann.inputLayer = malloc(din * sizeof * Neuron);

К этому:

ann.inputLayer = new Neuron[din];

new Здесь читатели более понятны вашему коду, при необходимости выполняют конструкцию и возвращают правильный тип указателя.

(То же самое с dout линия)

Редактировать:

Вы также, вероятно, найдете std::vector много легче управлять указателями.

1

Просто для справки: причина, по которой вы получаете ошибки, в том, что вы компилируете код C с помощью компилятора C ++. malloc возвращает void*, В C это неявно преобразуется в любой другой тип указателя; в C ++ вам нужно явное преобразование.

Кроме того, как говорят другие, вы должны никогда использование malloc в C ++ (если только из соображений совместимости с C — т.е. вы передаете указатель на функцию, написанную на C, которая будет вызывать free в теме). На самом деле, из того, что вы показали, не должно быть никаких указателей и динамического выделения: определите ваши типы, добавьте конструкторы, а когда вам нужно больше одного, используйте std::vector,

0
По вопросам рекламы [email protected]