2010-06-15 2 views
5

У меня есть простая функция Bar, которая использует набор значений из набора данных, который передается в виде массива структур данных. Данные могут поступать из двух источников: постоянный инициализированный массив значений по умолчанию или динамически обновляемый кеш.Как передать массив const или массив переменных в функцию в C?

Вызывающая функция определяет, какие данные используются и должна быть передана в Bar. Bar не нужно редактировать какие-либо данные и на самом деле никогда этого не делать. Как мне объявить параметр данных 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, NOT C++, если это имеет значение;

Редактировать
О, еще одна вещь. Когда я использую примерный прототип, я получаю предупреждение о несоответствии спецификатора типа (потому что я передаю изменчивую ссылку на массив const?). Что я должен изменить для этого?

+0

+1, только потому, что я рад, что есть еще люди, которые не помещают свои вопросы 'C/C++' и делают разницу между ними: D – ereOn

ответ

8

Вы хотите:

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

Параметр декларации const Foo *x означает:

x является указателем на Foo, что я обещание не менять.

Этот прототип вы можете передать указателю неконсоли на Bar.

+0

Я думал, что объявлен Foo «указатель, который нельзя изменить», а не указатель на «Foo, который нельзя изменить». – CodeFusionMobile

+5

Нет - 'const Foo * x' означает:' * x' является 'const Foo'. Чтобы объявить параметр как указатель, который не может быть изменен (что гораздо менее полезно), вам нужно написать 'Foo * const x' :) – psmears

+0

Спасибо за разъяснение. Как вы можете видеть, я пишу 'Foo *' not '* x', потому что я думаю о x как' Foo * ', а не' * x' как указатель на 'Foo'. Это облегчает отслеживание переменных, но делает вещи, подобные указателям на 'const', довольно запутанным. – CodeFusionMobile

0

Как вы уже сделали - функция принимает указатель на данные (сопзЬ, если это не нужно, чтобы изменить его)

Тогда либо передать указатель, если вы распределили данные с таНос, или первый элемент если это статический массив.

+0

Я получаю предупреждение о несоответствии типа, когда я это делаю потому что я передаю изменчивую ссылку на массив const. Как мне получить это? – CodeFusionMobile

+0

@CSharperWithJava: вы получаете эту ошибку, потому что в настоящее время вы пропускаете 'const' в объявлении' Bar' ... – psmears

+0

Как и другие ответили - вам нужно сделать указатель arg const, если вы передаете постоянное значение (если у вас нет особо прощающего компилятора!) –