2015-08-25 93 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]; 
}; 

現在我的想法是創建一個指針的另一個數組(結構神經元**軸突)比當前陣列更大(增加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]'表示結構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**[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; 
} 

然後,您可以延長神經元這種方式:

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; 
} 

而且不要忘記釋放Neuron以避免內存泄漏之前調用free(neuron->axon) ...

+0

@MattMcNabb:謝謝你的修復。發佈編輯。 –