Una ayudita con un código C#

Hola! Os cuento un poco cómo está la cosa y como la he resuelto yo. Tengo declarado un vector como variable global que es dónde guardo los datos. Tengo un par de funciones que escriben datos en esa variable global, cada una a partir de una determinada posición.:

Si por ejemplo quiero escribir el contenido de un string a partir de la posición 7 de mi vector, uso un bucle que recorre mi string y va copiando caracter a caracter en mi vector:
unsigned char vector[100];

void scribir()
{
unsigned char string[10];

for (int i=0;i<10;i++)
   vector[7+i]=string[i];
}


¿Hay alguna otra manera más elegante ó más eficiente de hacer ésto? Me imagino que con punteros se pueda conseguir algo así, estuve haciendo pruebas pero no conseguí nada.

Gracias!!
Si quieres copiar cadenas puedes usar las funciones strcpy o aun mejor, strncpy, eso si, son funciones para copiar cadenas, incluido el '\0'.

Si quieres copiar desde un vector hasta otro, tienes la funcion mencpy, si los vectores se solapan bcopy.

Para cualquier duda haz un man de las funciones
No se muy bien lo que quieres hacer, pero si lo que quieres es simplemente copiar una tabla de carateres de menor tamaño en una global del mayor tamaño (en este caso la posicion 7) , esta bien lo que estas haciendo, lo unico que se me ocurre es que si tienes una función para cada parte de la tabla, que no se si es eso lo que estas haciendo (una funcion a partir del 7, otra a partir del 14 etc), modificaróa la función y le añadiria un paramatr para saber a partir de donde quieres que la escriba. El strcpy esta bien si lo que quieres es copiar una cadena a otra, pero esto copiara asta el caracter "\0" inclusive de la cadena, y lo copiará al principio de la tabla, dado que la tabla de caracteres de 100 elementos es una cadena, muy larga, pero una cadena al fin de al cabo.
Estoy haciendo lo que quiero. El vector grande es un paquete ethernet, según la posición son las cabeceras (o datos) de los protocolos que están por encima.

Por lo visto tengo que usar memcpy ó memmove (ya que la variable origen, una vez copiada no la necesito para nada), pero tengo 3 dudas:
-Respecto a optimización de código (me refiero a consumo de memoria y esas cosas), ¿es más efectivo usar memmove que memcpy?

-Si quiero copiar el vector en la posición 7 de mi buffer, ¿podría hacerlo así?
memcpy (str2+7,str1,strlen(str1));


-Mi vector a copiar lo tengo en el main() y quiero pasárselo por referencia a una función, que entre otras cosas, será la que haga el memcpy.
Para llamar a mi función, al tratarse de un vector no tengo que utilizar &, ¿no? Me valdría solo con el nombre.
Al recibie el argumento, con usar un punte * me serviría, no?

Gracias!!!
manugarrote escribió:Estoy haciendo lo que quiero. El vector grande es un paquete ethernet, según la posición son las cabeceras (o datos) de los protocolos que están por encima.

Por lo visto tengo que usar memcpy ó memmove (ya que la variable origen, una vez copiada no la necesito para nada), pero tengo 3 dudas:
-Respecto a optimización de código (me refiero a consumo de memoria y esas cosas), ¿es más efectivo usar memmove que memcpy?


No te preocupes tanto por la optimización y más por entender las diferencias entre memcpy y memmove. Lee la documentación y decide. No obstante, lee un poco más abajo.

manugarrote escribió:-Si quiero copiar el vector en la posición 7 de mi buffer, ¿podría hacerlo así?
memcpy (str2+7,str1,strlen(str1));


Si eso es lo que quieres hacer... será mucho más claro si usas strncpy.

manugarrote escribió:-Mi vector a copiar lo tengo en el main() y quiero pasárselo por referencia a una función, que entre otras cosas, será la que haga el memcpy.
Para llamar a mi función, al tratarse de un vector no tengo que utilizar &, ¿no? Me valdría solo con el nombre.
Al recibie el argumento, con usar un punte * me serviría, no?


Generalmente puedes asumir que el nombre de un array es un puntero al primer elemento.

- ferdy
He estado haciendo pruebas con memcpy y todo perfecto. Una preguntilla, ¿podría utilizarlo para copiar una cadena de caracteres en lugar de un vector? Me imagino que en este caso se incluiría el '\0' al final, ¿no?

Lo que hago ahora es definir un vector de carácteres y copiar en cada hueco del vector el dato que quiero (usando memcpy), lo que me gustaría sería definir todos los datos en un string y copiarlo.

Gracias!!!
Una pregunta más:
Yo defino un vector así:
uint8_t message[] = {'T','e','s','t'};


¿Podría definir una string del mismo modo?
Una forma de hacerlo es así:
char cadena[4] = "Test";

Pero tengo que poner lo que ocupa la cadena. Otra opción es hacerlo con malloc, pero defino un tamaño igualmente.

¿Se puede hacer lo que digo o es imposible?

GRACIAS!!!
Creo que para hablar de C y su superior deberíamos usar el mismo hilo y que no esté desperdigado por el foro no?
Solo es mi opinión :)
Os recuerdo la dirección:
hilo_ayuda-codigo-c_1365391
7 respuestas