2015-06-17 253 views
1
struct GENERATIONS 
{ 
char generation[MAX_ROWS][MAX_COLS]; 
int hasCycle; 
}; 

typedef struct GENERATIONS Generation; 

我有類型結構的數組:將元素添加到結構陣列

Generation generations[MAX_GENERATIONS]; 

我聲明一個Generation變量是這樣的:

Generation *currentGeneration = NULL; 
currentGeneration = (Generation *) malloc(sizeof(Generation)); 

並嘗試生成添加到一個數組世代:numGenerations設置爲0,然後通過循環遞增。

copyGeneration(currentGeneration); 
generations[numGenerations] = currentGeneration; 

然而,每次從類型'struct Generation *'分配類型'Generation'時,我都會得到錯誤不兼容的類型。我知道這與我不明白但需要的指針有關。

爲什麼,當我聲明數組爲:

Generation *generations[MAX_GENERATIONS]; 

一切突然作品?

回答

2

每個currentGeneration是指向Generation的指針。然而,當你聲明一個數組Generation generations[MAX_GENERATIONS]它期望每個索引 a Generation,而不是一個指針。但是當你聲明數組爲Generation *generations[MAX_GENERATIONS]時,它期望每個索引都是指向Generation的指針,這就是你分配給每個索引的指針。

+0

是有道理的,當我測試從世代陣列得到的元件,我將創建一個新的代(如上所示)和做'克=世代[0]'。然後我可以使用g來訪問所有的「對象」數據,而無需使用'&'將其解除引用,爲什麼? –

+0

你用' - >'訪問過嗎?這就是你訪問結構指針數據的方式。例如'G-> hasCycle'。 –

+0

是的,這正是我的做法 –

1

錯誤告訴你到底發生了什麼問題。您的變量currentGeneration是「生成指針」類型,而變量generations是「生成數組」的類型。您不能將生成指針指定給生成數組的索引 - 您只能分配一代。

當您將數組聲明爲Generation *generations[MAX_GENERATIONS]時,一切正常,因爲您將指向Generation的指針分配給Generation的指針數組的索引。

0

currentGenerationGeneration *而不是Generation

您需要一個Generation *的數組來保存它,而不是數組Generation

1

要解決此問題,您可以採用其他方式繼續。你可以做的就是這個

#define MAX_GENERATIONS 1024 // you can take some other value too 
#include <stdio.h> 
#include <stdlib.h> 
static int count = 0 

Generation** push(Generation** generations, Generation obj){ 
count++; 
if (count == MAX_GENERATIONS){ 
    printf("Maximum limit reached\n"); 
    return generations; 

if (count == 1) 
    generations = (Generation**)malloc(sizeof(Generation*) * count); 
else 
    generations = (Generation**)realloc(generations, sizeof(Generation*) * count); 

generations[count - 1] = (Generation*)malloc(sizeof(Generation)); 
generations[count - 1] = obj; 

return generations; 
} 

int main(){ 
    Generation** generations = NULL; 
    Generation currentGeneration; 
    // Scan the the elements into currentGeneration 
    generations = push(generations, currentGeneration); // You can use it in a loop 
} 
+0

與這看起來一樣好,它似乎有點高級,我的教授可能知道它來自我以外的來源。我會說謝謝你,我會在將來嘗試這個! –

+0

好的沒有問題..但目標是,你明白這裏的邏輯......如果可能的話,通過投票來幫助我贏得聲譽。 –