none
Definir un struct como tipo de dato RRS feed

  • Pregunta

  • Hola! recién estoy arrancando a programar con Visual C++. Estoy desarrollando una aplicación de windows form en la que leo datos del puerto serie y los escribo a un archivo de texto. Para esto ultimo, ademas de la clase Formulario, he creado una clase para manejar la escritura y lectura de datos a archivo de texto.

    Mi problema es que quiero declarar un struct como si fuera un tipo de dato para poder definir variables en ambas clases Form y Archivo. Por ejemplo

     
    struct Pack{
                 int a;
                 float b;
                }DATA;
    

     y luego en ambas clases poder crear variables como por ejemplo: DATA UNO; DATA DOS;. Lo que hice fue, crear un archivo de cabecera datos.h con la definicion de mi struct dentro. Luego incluir este archivo en mi Form.h y luego  en la clase Formulario agregue como variables privadas:

    DATA uno;
     

    pero al momento de compilar me arroja los siguientes errores, y todos en la linea donde defino DATA uno;

    Error	1	error C2146: error de sintaxis : falta ';' delante del identificador 'uno'
    Error	2	error C4430: falta el especificador de tipo; se presupone int. Nota: C++ no admite default-int
    Error	3	error C4430: falta el especificador de tipo; se presupone int. Nota: C++ no admite default-int	
    
    	

    Si la comento a esa linea, el error que me arroja es el siguiente:

    > main_prog.obj : error LNK2005: ya se definió "struct Pack DATA" (?DATA@@$$Q3UPack@@A) en Form1.obj


    Me es casi evidente que estoy haciendo las cosas de manera muy desprolija, si alguien se le ocurre otra manera de como puedo resolver mi problema y me la comenta le estaré muy agradecido. O si pueden identificar donde tengo la falla también les agradeceré. He probado declara los datos de manera global pero no he tenido suerte. Desde ya muchs gracias, y si en algo no fui lo suficientemente claro solo díganme. Saludos!

     
    • Editado chiten miércoles, 10 de marzo de 2010 20:17 lectura
    miércoles, 10 de marzo de 2010 20:15

Respuestas

  • Hola de nuevo, he aquí la solución a mis problemas. Después de haber leído lo que dice en esta pagina http://msdn.microsoft.com/es-es/library/xhfb39es.aspx definí mi struct de la siguiente manera:
    public ref struct Pack{
                 int a;
                 float b;
                };
    Lo de public fue porque el compilador me arrojaba unos warnings sobre unas incongruencias de variables privadas con publicas, algo así.
    Bueno, y ya dentro de la clase, para crear mis variables del struct, solo con declararlas donde lo necesite de la siguiente manera:

    Pack^ uno;
    Pack^ dos;


    y luego inicializarlas en el constructor de la clase de la siguiente manera:

    uno = gcnew Pack;
    dos = gcnew Pack;
    


    Y listo, ya esta todo funcionando. De todas maneras si alguien tiene alguna sugerencia, soy todo ojos! ;) saludos!



    jueves, 11 de marzo de 2010 2:56

Todas las respuestas

  • Hola de nuevo, he aquí la solución a mis problemas. Después de haber leído lo que dice en esta pagina http://msdn.microsoft.com/es-es/library/xhfb39es.aspx definí mi struct de la siguiente manera:
    public ref struct Pack{
                 int a;
                 float b;
                };
    Lo de public fue porque el compilador me arrojaba unos warnings sobre unas incongruencias de variables privadas con publicas, algo así.
    Bueno, y ya dentro de la clase, para crear mis variables del struct, solo con declararlas donde lo necesite de la siguiente manera:

    Pack^ uno;
    Pack^ dos;


    y luego inicializarlas en el constructor de la clase de la siguiente manera:

    uno = gcnew Pack;
    dos = gcnew Pack;
    


    Y listo, ya esta todo funcionando. De todas maneras si alguien tiene alguna sugerencia, soy todo ojos! ;) saludos!



    jueves, 11 de marzo de 2010 2:56
  • Solo ten en cuenta que ahora estás utilizando código administrado. Si eso es
    lo que deseas, adelante.

    Típicamente, en C una estructura se declara así:

    struct Pack { int a; float b; };

    y para instanciar el objeto, haces:

    struct Pack pack;
    pack.a = 5;
    pack.b = 7F;

    Es decir, "struct" es parte de la declaración. Como es engorroso andar
    escribiendo struct Pack, los programadores de C solían hacer esto:

    typedef _Pack { int a; float b; } Pack;

    Y dado que Windows está escrito en C y por ende su API es C, así está hecho
    todo el código de Windows. En C++ ya no es necesario, puesto que simplemente
    haces

    struct Pack { int a; float b; };
    Pack pack;
    pack.a = 5;
    pack.b = 7F;

    y lixto. Ahora, como tú lo hiciste (con ref y gcnew) estás utiliando las
    extensiones de C++ para el .NET Framework, llamado C++/CLI. Puedes mezclar
    C++ con C++/CLI, solo ten cuidado porque si luego utilizas código no
    administrado (i.e. C++ nativo) tendrás problemas con las conversiones entre
    tipos de datos.

    No quiere decir que esté mal como lo hiciste, solamente ten eso en mente
    para posteriormente en tu desarrollo.

    Saludos.




    Fernando Gómez
    fermasmas.wordpress.com
    jueves, 11 de marzo de 2010 5:01