2011-10-17 58 views
0

我正在將神經網絡模擬器從Perl轉換爲C。我已經開始工作了,但我對部分代碼並不滿意。我定義了一個struct網絡(typedefed爲NETWORK),它包含一個指向雙精度數組的指針和一個指向NEURONs指針數組的指針,這是另一個結構體。這裏是他們是如何定義的:C結構體,結構體的指針以及正確的初始化

typedef struct neuron { 
    double *inputweights; 
    double *neuronweights; 
    double value; 
} NEURON; 

typedef struct network { 
    NEURON **neurons; 
    double *outputs; 
} NETWORK; 

起初,我試圖初始化這些是這樣的:

NEURON* myvariable; 

當然,沒有工作,因爲沒有記憶竟是分配,但。我知道我可以這樣初始化:

NEURON myvariable; 
NEURON* ptr = &myvariable; 

但是,當我試圖做的是進入一個循環,並將其存儲在指針數組中,它似乎像以前的指針丟失或重置每個迭代和我遇到各種各樣的錯誤。我在做這樣的事情:

NETWORK mynetwork; 
for (i = 0; i < NEURON_COUNT; i++) { 
    NEURON myneuron; 
    reset_neuron(&myneuron); // Basically a zero fill of the arrays 
    mynetwork->neurons[i]=&myneuron; 
    myneuron->inputweights[0] = 1; // Sets the current neuron, first input 
    printf("First neuron, first input is %f\n", mynetwork->neurons[0]->inputweights[0]); 
    // The printf gives 1 on the first iteration, and 0 on every following iteration. 
} 

這給我的印象是myneuron總是/相同/存儲位置,即使我仍然保持一個指針到最後一個,所以我不斷進行復位相同地點。當然,我也可以使用malloc強制每個神經元是不同的:

NEURON* myvariable = malloc(sizeof(NEURON)); 

而且這樣的作品,但似乎有點像雜牌。我應該困擾於使用指向我的結構的指針嗎?有沒有辦法初始化一個結構指針,而不訴諸低級malloc和sizeof?

+0

我知道你想要'NEURON myneuron'是某種形式的聲明 - 它是,但是在循環結束後,你的對象也會消失。這就是爲什麼我們有malloc – fazo

+0

酷,一個隨機忍者downvote到一個兩歲的問題。 – Dan

回答

3

這正是malloc的用途。當您需要不同數量的特定類型對象並需要控制它們的分配位置時,請使用malloc。爲什麼它看起來像一個混亂?

+0

我想這只是我不習慣低級別的內存管理,它似乎是自己分配內存的東西,應該只在異常情況下才能完成,但是如果你說那就是我該怎麼做的,那就好了。我顯然需要確保結構中的所有指針都是用'malloc()'初始化的。關於結構如何佈置的任何評論?我想知道如果他們可以設計得更好,或者如果有理由把一個指向數組/結構的指針而不是數組/結構本身? – Dan