2015-08-25 2 views
-2

Итак, я пытаюсь поэкспериментировать с искусственной нейронной сетью или по крайней мере царапать поверхность. Но вот моя проблема, я не могу найти способ увеличить размер массива, содержащий указатели на другие «нейроны».Измените указатель массива на гораздо больший массив

Вот мой код для расширения размера моего искусственного нейрона.

void extendNeuron(NeuronPtr *base, NeuronPtr * dest) { 
    (*(*base)->axon[sizeof((*base)->axon)/sizeof(*(*base)->axon) - 1]) = *dest; 

    struct Neuron *** newAxon[sizeof((*base)->axon)/sizeof(*(*base)->axon) + 1]; 

    memcpy(newAxon, (*base)->axon, sizeof((*base)->axon)); 

    **(*base)->axon = ***newAxon; 
} 

А вот структура для моих Нейроны

struct Neuron{ 
    char label[100]; 
    struct Neuron **axon[1]; 
}; 

Теперь моя идея заключается в том, чтобы создать еще один массив указателей (структура Neuron ** аксон), который больше, чем текущий массив (увеличить его на 1), а затем измените указатель аксона на этот массив. Но я не знаю, как это сделать.

До сих пор вот мой код:

struct Neuron ** newAxon[sizeof((*base)->axon)/sizeof(*(*base)->axon) + 1]; //newAxon is supposed to be bigger than the axon of base 

    memcpy(newAxon, (*base)->axon, sizeof((*base)->axon)); //then I'm trying to copy the axon of base to the newAxon 

    **(*base)->axon = ***newAxon; //then change the pointer of axon to newAxon 
+4

Любая причина вы не можете использовать ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector), который может автоматически вырасти? – NathanOliver

+1

Что вы подразумеваете под символом '[1]' в коде 'struct Neuron ** axon [1]:' Я знаю, что это означает, и я действительно сомневаюсь, что это то, что вы намереваетесь. – JSF

+0

Ваше использование 'sizeof' также не означает, что вы хотели, чтобы это означало (я знаю, что вы хотели, а также то, что это значит, и они не совпадают). – JSF

ответ

1

Я предположу следующее:

  • axon будет всегда создан через malloc (или одного из его производных)
  • void extendNeuron(NeuronPtr *base, NeuronPtr * dest) добавляет Dest в конце массива base->axon
  • axon массив, если он завершен нулевым указателем, потому что в C вы не можете извлечь размер массива, поэтому вы должны либо сохранить его длину во вспомогательной переменной, либо использовать соглашение для идентификации последнего элемента (или оба типа argv)
  • axon это просто массив указателей на Neuron (Neuron **) вместо Neuron**[1]

Вы бы инициализировать новый Neuron таким образом:

void init(Neuron *neuron, const char *label) { 
    strncpy(neuron->label, label, sizeof(neuron->label)); 
    neuron->label[sizeof(neuron->label)-1] = '\0'; /* if label was too long */ 
    neuron->axon = malloc(sizeof(Neuron *)); 
    /* control neuron->axon != NULL */ 
    neuron->axon[0] = NULL; 
} 

Вам нужно вспомогательную функцию, чтобы найти длину axon массив:

int axon_length(Neuron *neuron) { 
    int i = 0; 
    while(neuron->axon[i] != NULL) i++; 
    return i; 
} 

Вы можете расширить Neuron таким образом:

void extendNeuron(NeuronPtr *base, NeuronPtr * dest) { 
    int len = axon_length(base); 
    Neuron **p = realloc(base->axon, sizeof(Neuron *) * (n+2)); 
    /* test p != NULL ... */ 
    base->axon = p; 
    p[n] = dest; 
    p[n+1] = 0; 
} 

И не забудьте позвонить free(neuron->axon) перед выпуском Neuron, чтобы избежать утечки памяти ...

+0

@MattMcNabb: Спасибо за исправление. Сообщение отредактировано. –

Смежные вопросы