2010-06-15 37 views
5

Tengo una función simple Bar que utiliza un conjunto de valores de un conjunto de datos que se transfiere en forma de una matriz de estructuras de datos. Los datos pueden provenir de dos fuentes: una matriz inicializada constante de valores predeterminados o una memoria caché actualizada dinámicamente.¿Cómo puedo pasar una matriz de const o una matriz variable a una función en C?

La función de llamada determina qué datos se utilizan y se deben pasar a Bar. Bar no necesita editar ninguno de los datos y, de hecho, nunca debería hacerlo. ¿Cómo debo declarar el parámetro de datos Bar para poder proporcionar datos de cualquiera de los conjuntos?

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 

Nota, esto es C, NO C++ si eso hace la diferencia;

Edición
Ah, una cosa más. Cuando uso el prototipo de ejemplo obtengo una advertencia de discrepancia de calificador de tipo, (porque estoy pasando una referencia mutable a una matriz de const?). ¿Qué tengo que cambiar por eso?

+0

1, sólo porque me alegro todavía hay algunas personas que no etiquetar sus preguntas 'C/C++' y marcan la diferencia entre los dos: D – ereOn

Respuesta

8

que desee:

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

El parámetro declaración const Foo *x significa:

x es un puntero a una Foo que promesa de no cambiar.

Podrá pasar un puntero no constante en Bar con este prototipo.

+0

Pensé que declaraba un puntero Foo "que no se podía cambiar", no un puntero a un "Foo que no se podía cambiar". – CodeFusionMobile

+5

No - 'const Foo * x' significa:' * x' es un 'const Foo'. Para declarar el parámetro como un puntero que no se puede cambiar (que es mucho menos útil), tendría que escribir 'Foo * const x' :) – psmears

+0

Gracias por la aclaración. Como puede ver, escribo 'Foo *' no '* x', porque pienso en x como' Foo * ', no' * x' como un puntero a 'Foo'. Hace que mantener el seguimiento de las variables sea más fácil, pero hace que las cosas como los indicadores para 'const' sean bastante confusas. – CodeFusionMobile

0

Como usted ha hecho - la función toma un puntero a los datos (const si no es necesario cambiarlo)

Entonces, o pasar el puntero si se asignan los datos con malloc, o el primer elemento si esto es una matriz estática.

+0

Aparece una advertencia calificador coincidencia de tipos cuando hago eso porque estoy pasando una referencia mutable a una matriz de const. ¿Cómo me acerco a eso? – CodeFusionMobile

+0

@CSharperWithJava: obtienes ese error porque actualmente te falta el 'const' en la declaración de' Bar' ... – psmears

+0

Como respondieron los demás - necesitas hacer que el puntero arg const si pasas un valor constante (a menos que tenga un compilador particularmente indulgente!) –

Cuestiones relacionadas