Ошибка
error: incompatible types when assigning to type ‘ann {aka struct ann}’ from type ‘ann * {aka struct ann *}
возникает из-за того, что population[i]
является struct ann
, а не указателем на него. Различные типы!
Что нужно сделать, как уже было сказано в ответе Стефана Лехнера, это либо изменить массив снаружи (сделать его массивом указателей), либо вернуть тип функции create ()
, сделав ее вернуть саму структуру.
Я собираюсь предложить вам изменение интерфейса create()
для передачи указателя на него в качестве параметра структуры вывода, которая будет заполнена.
В функции вызова, где определяется массив указателей на ann
:
ann *population[10] = { 0 };
for( i = 0; i < 10; i++ ){
if ( create( &population[i], trainset->num_inputs, 1 , hidden, trainset->num_outputs) < 0 ){
printf ("Issues during creation of ann #%d\n", i);
break;
}
}
// Remember to free the pointers!
Нет выделения! Он перемещается внутрь create()
, что будет иметь два изменения интерфейса:
- Выходной указатель передается как параметр (первый, в моем примере)
- Возвращает код ошибки (0 при успехе, <0 при ошибке) </li>
int create(ann **outstruct, int inputs, int hidden_layers, int hidden, int outputs){
int ret = 0;
ann *tmp = malloc( sizeof(ann));
// ...
//do whatever you need to initialize the newly allocated struct
// set ret to a negative value if anything goes wrong
// ... but in this case free tmp before returning!
//...
outstruct = tmp;
return ret;
}
В моем примере указатель ann **
должен был быть передан в create()
, потому что он внутренне выделил память.
Достаточно простого указателя, если структуры размещаются снаружи, а create()
играет только роль для его заполнения.