Principales respuestas
Definir un struct como tipo de dato

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.objMe 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
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!
- Propuesto como respuesta Fernando A. Gómez domingo, 14 de marzo de 2010 8:31
- Marcado como respuesta Omar OrtizModerator miércoles, 10 de abril de 2013 14:48
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!
- Propuesto como respuesta Fernando A. Gómez domingo, 14 de marzo de 2010 8:31
- Marcado como respuesta Omar OrtizModerator miércoles, 10 de abril de 2013 14:48
-
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