Objeto to char*

Iniciado por Xedrox, 3 Agosto 2013, 20:34 PM

0 Miembros y 1 Visitante están viendo este tema.

Xedrox

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


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>.."


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:


-7>


Como se vera, nada que ver a lo esperado.

Espero haberme explicado bien y que puedan ayudarme.

Muchas Gracias de antemano.
Saludos!




do-while

¡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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Xedrox

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

do-while

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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

amchacon

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

Código (cpp) [Seleccionar]
class Dummy
{
   public:
           char *campo1;
           char *campo2;
           int campo3;
           long long campo4;
   
   Dummy() : campo1("Hola"),campo2("Cosita")
   {}

   ~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);
   }        
};


De todas formas, es mucho suponer pensar que los bytes se van almacenar como tu piensas *_*
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

#5
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 (c++) [Seleccionar]

class Chorrada
{
   public:
       Chorrada(char *s);

   private:
       char str[20];
};

Chorrada::Chorrada(char *s)
{
   memset(str,0,20);
   
   if(strlen(s) > 19)
       strncpy(str,s,19);
   else
       strcpy(str,s);
}

int main()
{
    Chorrada cosa("Hola");
    char buf[sizeof(Chorrada)];

    memcpy(buf,&cosa,sizeof(Chorrada));

    for(int i = 0 ; i < sizeof(Chorrada) ; i++)
        cout << buf[i];

    cout << endl;

    return 0;
}


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

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

Xedrox

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

do-while

?????

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

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

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

Xedrox

Cita de: do-while 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!

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

do-while

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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!