2011-11-21 79 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; 
}