Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Xedrox en 3 Agosto 2013, 20:34 PM

Título: Objeto to char*
Publicado por: Xedrox 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:


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!



Título: Re: Objeto to char*
Publicado por: do-while 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!
Título: Re: Objeto to char*
Publicado por: Xedrox 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
Título: Re: Objeto to char*
Publicado por: do-while 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!
Título: Re: Objeto to char*
Publicado por: amchacon en 3 Agosto 2013, 20:59 PM
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 *_*
Título: Re: Objeto to char*
Publicado por: do-while 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 (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!
Título: Re: Objeto to char*
Publicado por: Xedrox en 3 Agosto 2013, 21:30 PM
No puedo compilar tu programa, me dice en varias lineas "strat \160 in program", alguna idea?
Título: Re: Objeto to char*
Publicado por: 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!
Título: Re: Objeto to char*
Publicado por: Xedrox en 3 Agosto 2013, 21:37 PM
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
Título: Re: Objeto to char*
Publicado por: do-while 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!
Título: Re: Objeto to char*
Publicado por: Xedrox en 3 Agosto 2013, 21:55 PM
Ok voy a intenar reescribirlo, lo pegue en el notepad++ y mostrando todos los caracteres no encontre nada raro  :-(. Mientras te hago otra consulta, supongamos que tengo un "int" que sabemos que pesa 4 bytes. Si quisiera guardar el primer byte del "int" en un "char", como harias?
Título: Re: Objeto to char*
Publicado por: do-while en 3 Agosto 2013, 22:18 PM
Pues no se si el primero es el de mas peso. Para saberlo prueba esto:


int x = 0x44332211;
char s[4];

memcpy(s,&x,sizeof(int));

for(int i = 0 ; i < sizeof(int) ; i++)
    prihntf("%X",s[i]);



así sabrás si el byte mas significativo es el de la posición 0 o el de la 3.

¡Saludos!
Título: Re: Objeto to char*
Publicado por: Xedrox en 3 Agosto 2013, 22:26 PM
No importa el que mas pesa (aunque no se que quiciste decir con eso), aunque tenga un null en esa posicion, me lo deberia guardar igual.

Voy a seguir trabajando con el ejemplo anterior, muchas gracias!