una referencia recibe que por pasar parametro matriz llenar funciones funcion con como bidimensionales arreglos c arrays hardcoded

referencia - Matriz codificada en C como parámetro memcpy



pasar una matriz como parametro en c (4)

Quiero pasar una matriz de caracteres codificada como el parámetro de source a memcpy ... Algo como esto:

memcpy(dest, {0xE3,0x83,0xA2,0xA4,0xCB} ,5);

Este compilado con clang da el siguiente error:

cccc.c:28:14: error: expected expression

Si lo modifico para que sea (ver el paréntesis adicional):

memcpy(dest,({0xAB,0x13,0xF9,0x93,0xB5}),5);

el error dado por clang es:

cccc.c:26:14: warning: incompatible integer to pointer conversion passing ''int'' to parameter of type ''const void *'' [-Wint-conversion] cccc.c:28:40: error: expected '';'' after expression memcpy(c+110,({0xAB,0x13,0xF9,0x93,0xB5}),5);

Entonces, la pregunta:

¿Cómo paso una matriz codificada como el parámetro de origen de memcpy ( http://www.cplusplus.com/reference/cstring/memcpy/ )?

Yo he tratado:

(void*)(&{0xAB,0x13,0xF9,0x93,0xB5}[0]) - syntax error {0xAB,0x13,0xF9,0x93,0xB5} - syntax error ({0xAB,0x13,0xF9,0x93,0xB5}) - see above (char[])({0xE3,0x83,0xA2,0xA4,0xCB}) - error: cast to incomplete type ''char []'' (clang)

y algunas combinaciones más locas que me avergüenza escribir aquí ...

Recuerde: NO quiero crear una nueva variable para mantener la matriz.


La mejor solución no es hacer esto en absoluto, sino usar una variable temporal:

const char src[] = {0xE3,0x83,0xA2,0xA4,0xCB}; memcpy(dest, src, sizeof(src));

Este código es el más fácil de mantener, ya que no contiene "números mágicos", por lo que no contendrá ningún elemento faltante de la matriz ni errores de la matriz, como podría hacer la versión literal compuesta.

Este código también es compatible con C ++ y C90.

Lo más importante aquí es darse cuenta de que el código de máquina generado será idéntico de todos modos. No creas que estás haciendo ningún tipo de optimización utilizando literales compuestos.


Puedes usar literales compuestos .

int main() { unsigned char dest[5]; size_t i; memcpy(dest, (unsigned char[]){0xE3,0x83,0xA2,0xA4,0xCB} ,5); printf("Test: " ); for(i=0; i<sizeof(dest)/sizeof(dest[0]); i++) printf("%02X - ", dest[i] ); printf("/n"); return 0; }


Si usas C99 o posterior, puedes usar literales compuestos. ( N1256 6.5.2.5)

#include <stdio.h> #include <string.h> int main(void){ char dest[5] = {0}; memcpy(dest, (char[]){0xE3,0x83,0xA2,0xA4,0xCB} ,5); for (int i = 0; i < 5; i++) printf("%X ", (unsigned int)(unsigned char)dest[i]); putchar(''/n''); return 0; }

ACTUALIZACIÓN: Esto funcionó para C ++ 03 y C ++ 11 en GCC, pero se rechazó con la opción -pedantic-errors . Esto significa que esta no es una solución válida para C ++ estándar.

#include <cstdio> #include <cstring> int main(void){ char dest[5] = {0}; memcpy(dest, (const char[]){(char)0xE3,(char)0x83,(char)0xA2,(char)0xA4,(char)0xCB} ,5); for (int i = 0; i < 5; i++) printf("%X ", (unsigned int)(unsigned char)dest[i]); putchar(''/n''); return 0; }

los puntos son:

  • Hacer que la matriz sea constante, o tomar dirección de la matriz temporal será rechazada.
  • Números de conversión a char explícitamente, o la conversión de estrechamiento será rechazada.

Usted puede simplemente enviar una cadena como parámetro. Parece compilar bien.

#include <iostream> #include <string.h> using namespace std; int main() { char dest[6] = {0}; memcpy(dest,"/XAB/x13/XF9/X93/XB5", 5); return 0; }