Autor
|
Tema: [C] Copiar arreglo de caracteres con Operador Igual (Leído 4,495 veces)
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Muy buen dia. Algo que aprende el dia de ayer fue a copiar un arreglo de caracteres con el operador igual sin ayuda de memcpy o strcpy y derivados. Segun el libro no es algo que se recomiende muy a menudo pero que por lo general indican produce un codigo de ensamblador muy optimizado. Dadas 2 Cadenas de Igual longitud es posible copiar el contenido de una en otra con el operador igual. char cadena1[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char cadena2[27] = {0};
Normalmente la operacion siguientearca error de compilacion. cadena2 = cadena1;
Pero con ayuda de una estructura de datos de igual longitud: struct X{ char A[27]; };
podemos por ejemplo. *(struct X*)cadena2=*(struct X*)cadena1;
Repito en el libro no lo recomiendan pero indican que si lo que buscas es optimizar un poco mas el codigo generado sería una opcion valida. En el Libro muestran una funcion generica que hace una copia de bloques como el ejemplo mostrado para cualquier cantidad arbitraria de bytes. En lo que llegue a la casa pongo el código mencionado. Saludos.
|
|
« Última modificación: 22 Junio 2016, 14:20 pm por AlbertoBSD »
|
En línea
|
|
|
|
fary
|
Que buena Alberto #include <stdio.h> #define MAX 5 struct Cadena { char CantidadBytes[MAX]; }; int main() { char BufferOriginal[MAX] = "fary"; char BufferDestino[MAX] = {0}; *(struct Cadena*)BufferDestino = *(struct Cadena*)BufferOriginal; return 0; }
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
El libro menciona una funcion al estilo de memcpy llamada blockmove #include <stdio.h> #include <string.h> #define BLOCKSIZE 256 void blockmove(dest,src,count) register unsigned char *dest,*src; register unsigned count; { struct mblock{ char a[BLOCKSIZE]; }; while(count >= BLOCKSIZE){ *(struct mblock*)dest = *(struct mblock*)src; dest+=BLOCKSIZE; src+=BLOCKSIZE; count -= BLOCKSIZE; } while(count--) *dest++ = *src++; } int main() { char A[1048],B[1048]; blockmove(A,B,1048); return 0; }
Saludos!
|
|
|
En línea
|
|
|
|
class_OpenGL
Desconectado
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
Vale, igual se me ha ido un poco de las manos XDD #include <stdio.h> int main() { char cadena1[16] = "Hola"; char cadena2[16]; *(char **)cadena2 = *(char **)cadena1; return 0; }
Salida: Hola Hola
000000000023FE40 000000000023FE30
|
|
« Última modificación: 25 Junio 2016, 01:51 am por class_OpenGL »
|
En línea
|
| Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL |
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
*(char **)&cadena2 = *(char **)&cadena1;
Esa si que no me la sabia, hay que ver que codigo de ASM produce para ver si hay diferencia. Aun asi ese ejemplo solo copia 4 u 8 bytes no? Digo por el tamaño de un apuntador Deja hago pruebas y lo veo. Saludos!
Efectivamente solo copia bytes igual al tamaño de un apuntador: #include <stdio.h> #include <string.h> int main() { char cadena1[16]; char cadena2[16]; *(char **)&cadena2 = *(char **)&cadena1; return 0; }
Salida AAAAAAAAAAAAAAA AAAAAAAA
000000000060FE40 000000000060FE30
|
|
« Última modificación: 25 Junio 2016, 01:52 am por AlbertoBSD »
|
En línea
|
|
|
|
class_OpenGL
Desconectado
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
Sinceramente, no sé cómo el código funciona XD
|
|
|
En línea
|
| Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL |
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
El codigo orignal viene de que es posible usar el operador igual para copiar una estructura completa de una variable A a una variable B ejemplo: #include <stdio.h> #include <string.h> struct X { int A; int B; int C; }; int main() { struct X variable1, variable2; variable1.A = 1; variable1.B = 10; variable1.C = 100; variable2 = variable1; printf("%d,%d,%d\n",variable2. A,variable2. B,variable2. C); return 0; }
salida: La linea responsable por la copia completa del bloque de memoria de la variable1 a la variable2 es: variable2 = variable1;
Y de ahi el codigo mostrado en los post anteriores. lo que tu realizaste fue lo mismo pero solo con el tamaño de un apuntador. Saludos!
|
|
« Última modificación: 25 Junio 2016, 02:07 am por AlbertoBSD »
|
En línea
|
|
|
|
class_OpenGL
Desconectado
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
Justo lo acabo de entender y lo iba a publicar... Estoy ciego xD
|
|
|
En línea
|
| Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL |
|
|
|
|
fary
|
Es lo mismo solo qie tratas la estructura como si fuera plana. Saludos y muy buena también!!
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Convertir cadena en una arreglo de caracteres
Programación Visual Basic
|
Javilondo
|
3
|
10,556
|
29 Octubre 2008, 23:01 pm
por Javilondo
|
|
|
modificar arreglo de cadena de caracteres
Programación C/C++
|
kworld
|
2
|
6,266
|
31 Mayo 2010, 15:38 pm
por Littlehorse
|
|
|
Duda con puntero a arreglo de caracteres
Programación C/C++
|
dato000
|
5
|
4,810
|
30 Noviembre 2012, 21:13 pm
por xiruko
|
|
|
Cantidad de caracteres en un arreglo y cortar una cadena
Programación C/C++
|
josri
|
5
|
4,128
|
16 Marzo 2013, 16:34 pm
por naderST
|
|
|
duda con arreglo de caracteres
Programación C/C++
|
m@o_614
|
6
|
3,185
|
2 Abril 2014, 19:22 pm
por rir3760
|
|