2011-11-21 75 views
7

我在我已創建的結構是這樣在主傳遞結構的數組的函數C.傳遞結構的數組用C

麻煩:

int main() 
{ 
    struct Items 
    { 
     char code[10]; 
     char description[30]; 
     int stock; 
    }; 

    struct Items MyItems[10]; 
} 

我然後訪問它想:MyItems[0].stock = 10;

我想將它傳遞給一個函數,像這樣:

ReadFile(MyItems); 

該函數應該讀取數組,並能夠編輯它。然後我應該可以從其他函數訪問相同的數組。

我試過一堆聲明,但都沒有工作。 例如

void ReadFile(struct Items[10]) 

我已經看過其他問題,但事情是他們都完成了不同的工作,使用typedefs和星號。我的老師還沒有教過我們的指針,所以我想用我所知道的來做。

任何想法? :S

編輯:薩爾瓦託雷的答案工作後我固定我的原型:

void ReadFile(struct Items[10]); 
+0

這是「真正的代碼」。我在Visual Studio 2010中使用它,它工作。 :S – lelouch

+1

「有禮貌的對話」中的「Visual Studio」和「It works」不能用在一個句子中。你必須明確地說明你是否在談論特定的非標準平臺;否則人們會認爲你正在談論**標準的**語言。 –

+1

好的,我修好了。希望這已經足夠真實。< – lelouch

回答

7
struct Items 
{ 
    char code[10]; 
    char description[30]; 
    int stock; 
}; 

void ReadFile(struct Items items[10]) 
{ 
    ... 
} 

void xxx() 
{ 
    struct Items MyItems[10]; 
    ReadFile(MyItems); 
} 

這在我的編譯器效果很好。 你使用什麼編譯器?你有什麼錯誤?

記得在你的函數之前聲明你的結構,否則它將無法工作。

+0

謝謝,這工作後,我固定我的原型無效ReadFile(結構項[10]); – lelouch

0

你爲什麼不使用指針傳遞給數組需要它的方法呢?

如果你想要相同的結構數組,那麼你應該使用指向數組的指針,而不是作爲數組傳遞,因爲這將創建一個副本。

void ReadFile(struct Items * items);

,並在那裏你怎麼稱呼它

struct Items myItems[10]; 
ReadFile(myItems); 

需要小心使用指針...

+0

你能告訴我一些代碼來做後者嗎? – lelouch

+0

myItems將指向數組的第0個元素。 –

+0

這裏沒有拷貝,數組永遠不會被複制。 –

0

你幾乎必須使用指針這一點。你函數看起來是這樣的:

void ReadFile(Items * myItems, int numberOfItems) { 
} 
0

您需要使用指針數組,在這之後它很容易訪問其成員

無效ReadFile的(項目*項目)到;

應該工作。

0

那麼,當你傳遞一個像你這樣的結構時,它實際上會在函數中創建一個本地副本。所以它不會影響你的原始結構,不管你如何在ReadFile中修改它。

我不確定不同的方法,這可能不會回答你的問題,但我建議你嘗試指針。你一定會在C/C++中使用它們。他們可以,一旦你掌握了它們真正強大

+0

不正確,你可以試試看,C總是通過指針傳遞數組,你可以在ReadFile中修改它,這裏不涉及拷貝。 –

+0

@SalvatorePreviti你是對的!出於某種奇怪的原因,我明白他想在他的方法中使用這個結構,而不是陣列。 -_- – Kaisar

1

功能將不知道該類型如果您僅在main函數體範圍內聲明它,則存在struct Items。所以,你應該定義結構外:

struct Item { /* ... */ }; 

void ReadFile(struct Items[]); /* or "struct Item *", same difference */ 

int main(void) 
{ 
    struct Item my_items[10]; 
    ReadFile(my_items); 
} 

這是危險的,當然,因爲ReadFile不知道數組有多大(陣列總是腐爛到指針傳遞)。所以,你通常會添加此信息:

void ReadFile(struct Items * arr, size_t len); 

ReadFile(my_items, 10); 
+0

你的代碼修正了下劃線的錯誤,但它仍然沒有建立 - 我得到這個:http:// pastebin。com/HxPTcPmL – lelouch

+0

A)錯誤與代碼的這部分無關,B)現在我們又對語言感到困惑 - 突然它是C++? –

+0

大聲笑,對不起,我得到了錯誤的代碼,再試一次。這是從你的代碼嘗試 – lelouch

0

而不是你的聲明,聲明中這樣:

typedef struct { 
     char code[10]; 
     char description[30]; 
     int stock; 
}Items; 

和這樣的功能:

void ReadFile(Items *items); 

用typedef定義一個新類型,所以你不需要使用字「結構」每次。

3

Define struct Items以外的主。將數組傳遞給C中的函數時,還應該傳遞數組的長度,因爲函數無法知道該數組中有多少元素(除非它保證是固定值)。

正如Salvatore提到的那樣,您還必須在使用它們之前聲明(不一定要定義)任何結構,函數等。您通常會將結構和函數原型放在較大項目的頭文件中。

下面就是你們的榜樣的工作修改:

#include <stdio.h> 

struct Items 
{ 
    char code[10]; 
    char description[30]; 
    int stock; 
}; 

void ReadFile(struct Items items[], size_t len) 
{ 
    /* Do the reading... eg. */ 
    items[0].stock = 10; 
} 

int main(void) 
{ 
    struct Items MyItems[10]; 

    ReadFile(MyItems, sizeof(MyItems)/sizeof(*MyItems)); 

    return 0; 
}