C++ referencia a la matriz

No puedo crear una referencia a un unsigned char matriz z dentro de myfunc(). Lo he intentado de varias maneras, pero simplemente no puedo resolverlo. Este es mi intento más reciente:

int myfunc (int &y, unsigned char (&z)[2]);

int main(int argc, char *argv[]) {
 int y = 1;
 unsigned char z[2];

 int x = myfunc(y, z[2]);
}

int myfunc(int &y, unsigned char (&z)[2]) {
 y = 123;
 z[0] = foo;
 z[1] = bar;
 return 456;
}

Recibo los siguientes errores:

error: in passing argument 2 of ‘int myfunc(int&, unsigned char (&)[2])’

para linea int myfunc (int &y, unsigned char (&z)[2]);

Y:

error: invalid initialization of reference of type ‘unsigned char (&)[2]’ from expression of type ‘unsigned char’

para linea int x = myfunc(y, x);

¿Cómo debo hacer referencia a la matriz en sí misma (y no a una matriz de referencias?)?

preguntado el 03 de mayo de 12 a las 20:05

El uso de un vector hace que esto sea realmente fácil y, de lo contrario, es mucho mejor que las matrices sin formato. De todos modos, está llamando a su función al pasar un solo elemento. Use zno, z[2]. -

Estoy tratando de aprender vectores junto con esto, ¿cómo lo haría más fácil? La única forma que veo para que esto funcione es hacer que la matriz esté definida globalmente, lo que, según tengo entendido, no es bueno. -

Con un vector, tu firma sería: int myfunc (int &y, std::vector<unsigned char> &z). Proporcionan la sintaxis que esperaría del uso de otros tipos de parámetros. -

3 Respuestas

myfunc(y, z[2]);

La expresion z[2] es de tipo unsigned char (y se refiere a un elemento más allá del final de la matriz, por lo que es un comportamiento indefinido). Quieres hacer:

myfunc(y, z);

contestado el 03 de mayo de 12 a las 20:05

Gracias por la rápida respuesta :) - jwbensley

llamada debe ser: int x = myfunc(y, z);

Esto es porque z representa un unsigned char [2] pero z[2] representa el tipo char. también z[2] accede a la matriz fuera de los límites.

contestado el 03 de mayo de 12 a las 20:05

Gracias a ti también por la rápida respuesta :) - jwbensley

Estoy un poco confundido acerca de lo que estás tratando de hacer. En mi humilde opinión, tu firma debería ser int myfunc (int &y, unsigned char z[2]).

Los arreglos no se pasan "por valor" (si quiere hacer eso, entonces usar un vector es la forma más fácil), y el valor predeterminado hace que su get_mac función (que supongo que se suponía que era myfunc) trabajar como desee (a menos que haya entendido mal su deseo).

La firma int myfunc (int &y, unsigned char (&z)[2]) sugiere que es posible que desee cambiar el valor de z mismo en la persona que llama (no sólo elementos de z), pero incluso la persona que llama no puede hacer eso (!), y obtendrá un error si lo intenta. Si quieres eso, usa un puntero real.

Aún así, is un uso legítimo para pasar la matriz por referencia usando la sintaxis en su ejemplo, que es hacer cumplir el tamaño de matriz declarado. Pero si solo estás aprendiendo, no creo que debas preocuparte por esto todavía.

contestado el 04 de mayo de 12 a las 02:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.