elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Objeto to char*
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Objeto to char*  (Leído 4,178 veces)
Xedrox

Desconectado Desconectado

Mensajes: 274



Ver Perfil
Objeto to char*
« en: 3 Agosto 2013, 20:34 pm »

Buenas gente, tengo un problema que me esta rompiendo la cabeza, el tema es asi. Tengo un objeto dummy como este:

Código:
class Dummy
{
    public:
            char *campo1;
            char *campo2;
            int campo3;
            long long campo4;
   
    Dummy()
    {
          char *aux=(char*)malloc(5);
          char *aux1=(char*)malloc(5);
         
          strcpy(aux,"hola");
          strcpy(aux1,"xedr");
         
          campo1=aux;
          campo2=aux1;
          campo3=55;
          campo4=0;
    }
    ~Dummy(){}
   
    void imprimir()
    {
         printf("CAMPO 1: %s\n",campo1);
         printf("CAMPO 2: %s\n",campo2);
         printf("CAMPO 3: %d\n",campo3);
         printf("CAMPO 4: %d\n",campo4);
    }       
};

Lo que tengo que hacer en el main es guardar ese objeto en un char*. Debo considerar que en el char se guardan tipos como int y long long que deben ser guardados con los binarios, y no en formato ascci. Por ejemplo, como este objeto "p" va terminar con un "long long" de 8 bytes en 0, las ultimas 8 posiciones del char* espero que tengan un "NULL" guardado en esa posicion. Lo que hago en el main es esto, pero al imprimir el char* no salen los caracteres que espero, por lo menos la cadena deberia comenzar con "holaxedr....<binarios>.."

Código:
int main()
{
    Dummy *p=new Dummy();
    printf("El objeto pesa: %d\n",sizeof(*p)); //24
    char *a=(char*) malloc(24);
    memcpy(a,p,24);
   
    printf("%s",a);
   
   
    system("PAUSE");
    return 0;
}


La salida del programa sobre el segunda printf es:

Código:
-7>

Como se vera, nada que ver a lo esperado.

Espero haberme explicado bien y que puedan ayudarme.

Muchas Gracias de antemano.
Saludos!





En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Objeto to char*
« Respuesta #1 en: 3 Agosto 2013, 20:50 pm »

¡Buenas!

Tu idea es correcta, pero es lógico que no te salgan los caracteres, ya que la clase que en la clase se guardan solo los punteros que apuntan a la memoria que has reservado.

Es decir. Lo punteros están dentro de la clase, pero la memoria no lo está. No se si con un string te pasara lo mismo o no. Nunca lo he probado. Otra opción es declarar vectores char con un tamaño concreto. Así esa memoria si que pertenecerá a la clase, y cuando uses strcpy sobre un vector de char, aparecerá su contenido.

¡Saludos!


En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Xedrox

Desconectado Desconectado

Mensajes: 274



Ver Perfil
Re: Objeto to char*
« Respuesta #2 en: 3 Agosto 2013, 20:53 pm »

Osea, una clase no me serviria para esto? Tendria que implementar un typedef struct? Es lo que queria evitar...

De todas  maneras gracias por contestar.
Saludos
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Objeto to char*
« Respuesta #3 en: 3 Agosto 2013, 20:59 pm »

No, no.

No me refiero a eso. Aunque utilices un struct el problema será el mismo siempre que reserves memoria de forma dinámica.

Esto es la clase                                       Esto la memoria reservada que está fuera

--------------------------
|                               |
| puntero------------------------------> "Hola soy una cadena que estoy fuera y aqui hace frio"
|                               |
--------------------------

Y si en lugar de utilizar punteros y asignar memoria dinámica utilizar un vector, pasa esto:

Tu clase

---------------------------------------------------------------------------
| vector = "Soy un vector que está calentito dentro de la clase" |
---------------------------------------------------------------------------

Que mal me sienta estudiar.

Espero que lo hayas entendido, sino pregunta.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Objeto to char*
« Respuesta #4 en: 3 Agosto 2013, 20:59 pm »

Prueba con esta variación sin memoria dinámica:

Código
  1. class Dummy
  2. {
  3.    public:
  4.            char *campo1;
  5.            char *campo2;
  6.            int campo3;
  7.            long long campo4;
  8.  
  9.    Dummy() : campo1("Hola"),campo2("Cosita")
  10.    {}
  11.  
  12.    ~Dummy(){}
  13.  
  14.    void imprimir()
  15.    {
  16.         printf("CAMPO 1: %s\n",campo1);
  17.         printf("CAMPO 2: %s\n",campo2);
  18.         printf("CAMPO 3: %d\n",campo3);
  19.         printf("CAMPO 4: %d\n",campo4);
  20.    }        
  21. };

De todas formas, es mucho suponer pensar que los bytes se van almacenar como tu piensas *_*
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Objeto to char*
« Respuesta #5 en: 3 Agosto 2013, 21:02 pm »

Ahí pasa lo mismo.

Los punteros están dentro de la clase, pero las cadenas literales están fuera.

Así que si hace un memcpy a una zona reservada con char, solo tendrá las direcciones donde empiezan las cadenas (los valores de los punteros).

El contenido de las cadenas está fuera de la clase.

¡Saludos!

Código
  1. class Chorrada
  2. {
  3.    public:
  4.        Chorrada(char *s);
  5.  
  6.    private:
  7.        char str[20];
  8. };
  9.  
  10. Chorrada::Chorrada(char *s)
  11. {
  12.    memset(str,0,20);
  13.  
  14.    if(strlen(s) > 19)
  15.        strncpy(str,s,19);
  16.    else
  17.        strcpy(str,s);
  18. }
  19.  
  20. int main()
  21. {
  22.    Chorrada cosa("Hola");
  23.    char buf[sizeof(Chorrada)];
  24.  
  25.    memcpy(buf,&cosa,sizeof(Chorrada));
  26.  
  27.    for(int i = 0 ; i < sizeof(Chorrada) ; i++)
  28.        cout << buf[i];
  29.  
  30.    cout << endl;
  31.  
  32.    return 0;
  33. }
  34.  

Ahora si que la información está dentro de la clase, prueba a hacer el memcpy como lo hacias antes.

¡Saludos!
« Última modificación: 3 Agosto 2013, 21:09 pm por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Xedrox

Desconectado Desconectado

Mensajes: 274



Ver Perfil
Re: Objeto to char*
« Respuesta #6 en: 3 Agosto 2013, 21:30 pm »

No puedo compilar tu programa, me dice en varias lineas "strat \160 in program", alguna idea?
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Objeto to char*
« Respuesta #7 en: 3 Agosto 2013, 21:34 pm »

?????

¿¿¿Has incluido todos los headers que te hacen falta???

A mi no me da problemas. ¿Que errores te da exactamente?

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Xedrox

Desconectado Desconectado

Mensajes: 274



Ver Perfil
Re: Objeto to char*
« Respuesta #8 en: 3 Agosto 2013, 21:37 pm »

?????

¿¿¿Has incluido todos los headers que te hacen falta???

A mi no me da problemas. ¿Que errores te da exactamente?

¡Saludos!

Solo tengo estos dos header:

#include <cstdlib>
#include <iostream>

Al querer compilar, sale varias veces:

./Documents and Settings/Nicolas/Escritorio/main.cpp:7: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:7: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:8: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:8: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:8: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:8: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:10: error: stray '\160' in program

../Documents and Settings/Nicolas/Escritorio/main.cpp:10: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:11: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:11: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:11: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:11: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp: In constructor `Chorrada::Chorrada(char*)':
../Documents and Settings/Nicolas/Escritorio/main.cpp:16: error: stray '\160' in program

../Documents and Settings/Nicolas/Escritorio/main.cpp:16: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:17: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:17: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:18: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:18: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:19: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:19: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:19: error: stray '\160' in program

../Documents and Settings/Nicolas/Escritorio/main.cpp:19: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:20: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:20: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:21: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:21: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:21: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:21: error: stray '\160' in program

../Documents and Settings/Nicolas/Escritorio/main.cpp: In function `int main()':
../Documents and Settings/Nicolas/Escritorio/main.cpp:26: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:26: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:27: error: stray '\160' in program

../Documents and Settings/Nicolas/Escritorio/main.cpp:27: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:29: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:29: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:31: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:31: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:32: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:32: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:32: error: stray '\160' in program

../Documents and Settings/Nicolas/Escritorio/main.cpp:32: error: stray '\160' in program

../Documents and Settings/Nicolas/Escritorio/main.cpp:34: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:34: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:36: error: stray '\160' in program
../Documents and Settings/Nicolas/Escritorio/main.cpp:36: error: stray '\160' in program

make.exe: *** ["../Documents and Settings/Nicolas/Escritorio/main.o"] Error 1

Ejecución Terminada
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Objeto to char*
« Respuesta #9 en: 3 Agosto 2013, 21:42 pm »

Por lo que acabo de ver en google, puede ser un error debido a que al copiar y pegar te has llevado caracteres extraños... (¿Puede ser?)

Prueba a reescribir las lineas en las que te da error.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines