2017-04-06 77 views
-1

大家好我有一個解決這個練習的問題。我從結構創建了一個實例,並用隨機值初始化了屬性。n個初始化實例的數組

現在我需要編寫一個函數來創建一個數組,並完全初始化該結構的實例。

struct FluxCapacitor* createFluxCapacitor(){ // Instance of my struct 
    struct FluxCapacitor *capi = malloc(sizeof(*capi)); 
    capi->value = rand(); 
    capi->c_string = randomString(); 
} 

我猜它說起來容易,當我解釋是這樣的:

當n是10例如,我想打印的陣列我應該有10個隨機數字和10個隨機字符串。

這就是現在的樣子

struct FluxCapacitor** createFluxCapacitorArray(unsigned int n) { 

struct capi **array = malloc(n * sizeof *array); 

for (int i = 0 ; i < n ; ++i) 
{ 
    array[i] = createFluxCapacitor(); 
} 

}; 

,我總是得到這個錯誤的main.c | 46 |錯誤:「for」循環初始聲明只在C99或C11模式允許|

+0

'struct FluxCapacitor','Flux'和'struct capi'有什麼區別? – mch

+0

我的錯我昨天改了我的代碼中的名字,並忘記了一個。看起來現在正確 Capi是struct FluxCapacitor的實例 – Timm

+0

對於您提到的特定錯誤,這意味着您的編譯器目標的版本不允許在'for()'中聲明值。 I.E.在'for'前聲明'i'而不是作爲它的一部分 – Toby

回答

0

你通過調用createFluxCapacitor();

創建的這一個實例,你在一個循環for(int i = 0; i < n; i++)

,並在每次創建一個實例的時間做到這一點,必須將其存儲在一個數組struct FluxCapacitor* my_array[n];這樣for(int i = 0; i < n; i++) my_array[i] = createFluxCapacitor();

0

編輯

問題已經改變了一點,你的代碼幾乎是完全正確的我在原來的回答中提出的建議,我將在這裏回答下面的新答案。

您遇到的錯誤消息是由for循環的初始化部分中您聲明i引起的。

for (int i = 0 ; ... 
// ^^^ here 

這是因爲你的編譯器默認爲C的過時的版本,您可以通過以下兩種方式之一來解決它:

  1. 聲明變量外的for循環

    int i; 
    for (i = 0 ; i < n ; ++i) 
    
  2. (更好的選擇)編譯到現代C11標準。你不說的編譯器是什麼,但你可以通過添加-std=c11作爲一個編譯器標記敵人例如迫使它

    cc -std=c11 main.c -o myprogram 
    

你只需通過數組初始化的每個磁通電容元素循環。

struct FluxCapacitor** createFluxCapacitorArray(unsigned int n) 
{ //Function for the Array I want to initialize with n instance of the struct 

    struct FluxCapacitor **array = malloc(n * sizeof *array); 
    for (int i = 0 ; i < n ; ++i) 
    { 
     array[i] = createFluxCapacitor(); 
    } 
} 

當你擺脫了數組,你做反向:

void freeArray(struct FluxCapacitor** array) 
{ 
    for (int i = 0 ; i < n ; ++i) 
    { 
     free(array[i]); 
    } 
    free(array); 
} 

您還需要修復createFluxCapacitor()錯誤(沒有return語句)。

+0

OP只是想要一個普通的數組。爲什麼指針指針? – Lundin

+0

@Lundin不,O​​P想要一個指向'FluxCapacitor'的指針數組。該函數的簽名是'struct FluxCapacitor ** createFluxCapacitorArray(unsigned int n)' – JeremyP

+0

您假定函數參數/返回值是有意義的。 – Lundin

1

從你的問題,你沒有理由建立一個一個指向結構的指針數組,但你可以直接建立結構數組:

struct FluxCapacitor* createFluxCapacitorArray(int n){ // Instance of my struct 
    int i; 
    struct FluxCapacitor *capi = malloc(sizeof(*capi) * n); 
    for (i=0; i<n; i++) { 
     capi[i].value = rand(); 
     capi[i].c_string = randomString(); 
    } 
    return capi; 
} 

然後,您可以使用它的方式:

struct FluxCapacitor *capi = createFluxCapacitorArray(n); 
... 
free(capi); 

只有一個單一的自由陣列完成後。

如果你真的需要一個指針數組來FluxCapacitor結構,您需要單獨的Alloc結構的數組和指針數組:

struct FluxCapacitor** createFluxCapacitorArray(int n){ // Instance of my struct 
    int i; 
    struct FluxCapacitor *capi = malloc(sizeof(*capi) * n); 
    struct FluxCapacitor **cp = malloc(sizeof(capi) * n); 
    for (i=0; i<n; i++) { 
     capi[i].value = rand(); 
     capi[i].c_string = randomString(); 
     cp[i] = capi + i; 
    } 
    return cp; 
} 

這樣的話,你仍然有一個真正的數組,可以做指針算法。另外,你只需要在完成時釋放2個元素:

struct FluxCapacitor **cp = createFluxCapacitorArray(n); 
... 
free(cp[0]); 
free(cp); 
+0

該問題要求指向FluxCapacitor的指針數組,而不是FluxCapacitor數組。你的退貨類型是錯誤的。 – JeremyP

+0

@JeremyP這是一個數組。返回一個數組指針似乎不必要的複雜。返回指針指針是不正確的。簡單地返回一個指向第一個元素的指針聽起來像是一個相當理智的想法,與這些選擇相比。 – Lundin

+0

@JeremyP:我對這個目標的理解是*現在我需要編寫一個函數,它創建一個數組,其中包含n個完全初始化的struct *的實例**。以上代碼完全回答了這個問題。 –