Es importante interpretar el código bien antes de aplicarlo a tu trabajo y si tquieres aportar algo puedes compartirlo con nosotros.
Solución:
Las matrices solo se pueden pasar por referencia, en realidad:
void foo(double (&bar)[10])
Esto le impide hacer cosas como:
double arr[20];
foo(arr); // won't compile
Para poder pasar un tamaño arbitrario array a foo
conviértalo en una plantilla y capture el tamaño de la array en tiempo de compilación:
template
void foo(T (&bar)[N])
// use N here
Deberías considerar seriamente usar std::vector
o si tiene un compilador compatible con c++11, std::array
.
Sí, pero cuando el argumento coincide con una referencia, el valor implícito array al puntero no es automático, por lo que necesita algo como:
void foo( double (&array)[42] );
o
void foo( double (&array)[] );
Tenga en cuenta, sin embargo, que al hacer coincidir, double [42]
y double []
son tipos distintos. si tienes un array de una dimensión desconocida, coincidirá con la segunda, pero no con la primera, y si tienes una array con 42 elementos, coincidirá con el primero pero no el segundo. (Este último es, en mi humilde opinión, muy contrario a la intuición).
En el segundo caso, también tendrás que pasar la dimensión, ya que no hay forma de recuperarla una vez dentro de la función.
Si desea modificar solo los elementos:
void foo(double *bar);
es suficiente.
Si desea modificar la dirección a (por ejemplo: realloc
), pero no funciona para matrices:
void foo(double *&bar);
es la forma correcta.
Si para ti ha resultado de provecho nuestro post, te agradeceríamos que lo compartas con otros seniors así nos ayudas a difundir esta información.