2010-06-15 149 views
5

我有一个简单的函数Bar,它使用一组数据集中的一组值,这些值是以数据结构数组的形式传入的。数据可以来自两个来源:一个常量初始化的默认值数组或一个动态更新的缓存。如何将常量数组或变量数组传递给C中的函数?

调用函数决定哪些数据被使用,应该传递给BarBar不需要编辑任何数据,实际上不应该这样做。我应该如何声明Bar的数据参数,以便我可以提供两组数据?

union Foo 
{ 
long _long; 
int _int; 
} 

static const Foo DEFAULTS[8] = {1,10,100,1000,10000,100000,1000000,10000000}; 
static Foo Cache[8] = {0}; 

void Bar(Foo* dataSet, int len);//example function prototype 

请注意,这是C,而不是C++,如果这有所作为;

编辑
哦,还有一件事。当我使用示例原型时,我得到了一个类型限定符不匹配的警告,(因为我传递一个可变引用到一个const数组?)。我需要改变什么?

+0

+1,只是因为我很高兴仍然有些人不会标记他们的问题'C/C++'并在两者之间做出区别:D – ereOn 2010-06-15 15:20:48

回答

8

你想:

void Bar(const Foo *dataSet, int len); 

参数声明const Foo *x表示:

x是一个指向Foo我 承诺不会改变。

您将能够通过此原型将非常量指针传入Bar

+0

我认为宣布了一个Foo“无法更改的指针”,而不是指向“无法更改的Foo”的指针。 – CodeFusionMobile 2010-06-15 15:23:39

+5

否 - 'const Foo * x'表示:'* x'是'const Foo'。要将该参数声明为无法更改的指针(这种方法远没有用),您必须编写'Foo * const x' :) – psmears 2010-06-15 15:26:15

+0

感谢您的澄清。正如你所看到的,我写'Foo *'而不是'* x',因为我认为x是'Foo *',而不是'* x'作为指向'Foo'的指针。它使跟踪变量更容易,但使像'const'的指针相当混乱。 – CodeFusionMobile 2010-06-15 15:34:29

0

当你做了 - 该函数采用指针数据(常量,如果它不需要更改)

然后要么通过指针,如果你分配使用malloc的数据,或者第一要素如果这是一个静态数组。

+0

当我这样做时,我得到了类型限定符不匹配警告因为我传递了一个可变引用到一个常量数组。我如何获得这个周末? – CodeFusionMobile 2010-06-15 15:19:55

+0

@CSharperWithJava:你得到那个错误是因为你现在在'Bar'的声明中缺少'const' ... – psmears 2010-06-15 15:21:24

+0

正如其他人所回答的那样 - 如果你传递一个常量值,你需要使指针arg为const(除非你有一个特别宽容的编译器!) – 2010-06-15 15:21:55