Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AlbertoBSD en 21 Junio 2016, 22:13 pm



Título: [C] Copiar arreglo de caracteres con Operador Igual
Publicado por: AlbertoBSD en 21 Junio 2016, 22:13 pm
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.

Código
  1. char cadena1[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  2. char cadena2[27] = {0};

Normalmente la operacion siguientearca error de compilacion.

Código
  1. cadena2 = cadena1;

Pero con ayuda de una estructura de datos de igual longitud:
Código
  1. struct X{
  2. char A[27];
  3. };
  4.  

podemos por ejemplo.

Código
  1. *(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.


Título: Re: [C] Copiar arreglo de caracteres con Operador Igual
Publicado por: fary en 22 Junio 2016, 14:16 pm
Que buena Alberto  ;-) 

Código
  1. #include <stdio.h>
  2. #define MAX 5
  3.  
  4. struct Cadena
  5. {
  6.    char CantidadBytes[MAX];
  7. };
  8.  
  9. int main()
  10. {
  11.    char BufferOriginal[MAX] = "fary";
  12.    char BufferDestino[MAX] = {0};
  13.  
  14.    *(struct Cadena*)BufferDestino = *(struct Cadena*)BufferOriginal;
  15.  
  16.    printf("%s",BufferDestino);
  17.    return 0;
  18. }
  19.  


Título: Re: [C] Copiar arreglo de caracteres con Operador Igual
Publicado por: AlbertoBSD en 25 Junio 2016, 00:51 am
El libro menciona una funcion al estilo de memcpy llamada blockmove

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define BLOCKSIZE 256
  5. void blockmove(dest,src,count)
  6. register unsigned char *dest,*src;
  7. register unsigned count;
  8. {
  9. struct mblock{
  10. char a[BLOCKSIZE];
  11. };
  12. while(count >= BLOCKSIZE){
  13. *(struct mblock*)dest = *(struct mblock*)src;
  14. dest+=BLOCKSIZE;
  15. src+=BLOCKSIZE;
  16. count -= BLOCKSIZE;
  17. }
  18. while(count--)
  19. *dest++ = *src++;
  20. }
  21.  
  22. int main() {
  23. char A[1048],B[1048];
  24. memset(B,'C',1048-1);
  25. blockmove(A,B,1048);
  26. printf("%s\n",A);
  27.    return 0;
  28. }

Saludos!


Título: Re: [C] Copiar arreglo de caracteres con Operador Igual
Publicado por: class_OpenGL en 25 Junio 2016, 01:23 am
Vale, igual se me ha ido un poco de las manos XDD

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4. char cadena1[16] = "Hola";
  5. char cadena2[16];
  6.  
  7. *(char **)cadena2 = *(char **)cadena1;
  8.  
  9. fprintf(stdout, "%s\n", cadena1);
  10. fprintf(stdout, "%s\n", cadena2);
  11. fputc('\n', stdout);
  12. fprintf(stdout, "%p\n", cadena1);
  13. fprintf(stdout, "%p\n", cadena2);
  14.  
  15. return 0;
  16. }

Salida:
Código:
Hola
Hola

000000000023FE40
000000000023FE30



Título: Re: [C] Copiar arreglo de caracteres con Operador Igual
Publicado por: AlbertoBSD en 25 Junio 2016, 01:48 am
Código
  1. *(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:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main() {
  5. char cadena1[16];
  6. char cadena2[16];
  7.  
  8. memset(cadena1,'A',15);
  9. *(char **)&cadena2 = *(char **)&cadena1;
  10.  
  11. fprintf(stdout, "%s\n", cadena1);
  12. fprintf(stdout, "%s\n", cadena2);
  13. fputc('\n', stdout);
  14. fprintf(stdout, "%p\n", cadena1);
  15. fprintf(stdout, "%p\n", cadena2);
  16.  
  17. return 0;
  18. }

Salida

Código:
AAAAAAAAAAAAAAA
AAAAAAAA


000000000060FE40
000000000060FE30


Título: Re: [C] Copiar arreglo de caracteres con Operador Igual
Publicado por: class_OpenGL en 25 Junio 2016, 01:51 am
Sinceramente, no sé cómo el código funciona XD


Título: Re: [C] Copiar arreglo de caracteres con Operador Igual
Publicado por: AlbertoBSD en 25 Junio 2016, 02:00 am
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:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4.  
  5. struct X {
  6. int A;
  7. int B;
  8. int C;
  9. };
  10.  
  11. int main() {
  12. struct X variable1, variable2;
  13. variable1.A = 1;
  14. variable1.B = 10;
  15. variable1.C = 100;
  16. variable2 = variable1;
  17. printf("%d,%d,%d\n",variable2.A,variable2.B,variable2.C);
  18. return 0;
  19. }

salida:

Código:
1,10,100

La linea responsable por la copia completa del bloque de memoria de la variable1 a la variable2 es:

Código
  1. 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!


Título: Re: [C] Copiar arreglo de caracteres con Operador Igual
Publicado por: class_OpenGL en 25 Junio 2016, 02:06 am
Justo lo acabo de entender y lo iba a publicar... Estoy ciego xD


Título: Re: [C] Copiar arreglo de caracteres con Operador Igual
Publicado por: fary en 25 Junio 2016, 11:40 am
Es lo mismo solo qie tratas la estructura como si fuera plana. :xD

Saludos y muy buena también!!