Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda con manejo de variables en Visual C++ 2005

Estas en el tema de Ayuda con manejo de variables en Visual C++ 2005 en el foro de C/C++ en Foros del Web. Saludos, para mi tesis de pregrado voy a desarrollar una aplicación que incorpore un modelo geomecanico, para aprender a usar el lenguaje ya que lo ...
  #1 (permalink)  
Antiguo 14/07/2006, 16:22
 
Fecha de Ingreso: julio-2006
Mensajes: 47
Antigüedad: 18 años, 5 meses
Puntos: 0
Ayuda con manejo de variables en Visual C++ 2005

Saludos, para mi tesis de pregrado voy a desarrollar una aplicación que incorpore un modelo geomecanico, para aprender a usar el lenguaje ya que lo debo enfocar en las bibliotecas de .NET, empece a crear codigo para una aplicación de consola, ya tengo como crear un mallado que se usara en otras partes del programa.

Ahora estoy mas o menos creando los formularios que conformaran la interfase grafica, desde el formulario principal llamo a los formularios secundarios por medio de botones (en este caso no estoy usando formularios MDI) para pedir los diferentes datos de entrada del programa, ahora mi problema es:

Como puedo crear variables globales que puedan ser usadas y/o modificadas en cualquiera de los formularios secundarios?, o por lo menos usadas?.

Con el codigo que cree para el mallado lo genero a partir de ciertos datos de entrada y lo almaceno en un arreglo, según lei puedo crear arreglos de arreglos(aun no lo he probado), lo que habia pensado era ir almacenando tanto los arreglos como ciertas variables en archivos de texto segun se van creando y que cuando sea necesario sean leidos de estos.

Si me logran ayudar con el manejo de este tipo de variables, eso tambien aplica a los famosos arreglos de arreglos?.

Hasta luego y muchas gracias por la ayuda que me puedan prestar.
  #2 (permalink)  
Antiguo 14/07/2006, 17:02
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años, 7 meses
Puntos: 0
Si haces un programa el cual se compone de distintos archivos fuente, pues la manera usual de usar una variable global es definir esta fuera de cualquier funcion una sola vez en cualquier de los archivos fuente, y declararla por medio de la palabra reservada extern en los archivos fuente donde la vayas a utilizar. Generalmente se pone la declaracion de las variables globales externas en un archivo de encabezado y se incluye este donde se vaya a usar la variable global.
  #3 (permalink)  
Antiguo 14/07/2006, 17:15
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
pues en C++, aun para .NET no hay mayor problema que declarar tus variables como globales, ya que el C++.NET no te exige empaquetar todas tus declaraciones dentro de una clase.
generalmente se hace en el fichero.h que el Visual C++ crea por defecto cuando usas encabezados precompilados, ya que el mismo IDE te exige incluirlo en todos los ficheros de tu proyecto.

estas usando el Viasul C++.NET 7 o el 8??
si es el 8 que tipo de codigo estas generando, Nativo, CLR, pure o safe??
dependiento de esto puedes crear tu arreglo como un puntero a puntero, como un arreglo de 2 dimenciones o como un arreglo de punteros.

si estas usando safe o pure, tendras que usar la plantilla de clase array<>

donde el primer parametro es el tipo y el segundo las dimenciones.

aunque he visto que suelen usarlo como una array de array

array<array<int> >^ arreglo2D;

Saludos.
  #4 (permalink)  
Antiguo 14/07/2006, 17:56
 
Fecha de Ingreso: julio-2006
Mensajes: 47
Antigüedad: 18 años, 5 meses
Puntos: 0
Saludos, la versión que estoy usando es la 8 y he procurado usar solo CLR, Cree usando una plantilla de aplicación CLR para windows, probe definiendo las variables en el .CPP que se creo junto al proyecto.
-------------------------------------------------------------------


-------------------------------------------------------------------
Funcionaria si agrego una clase al proyecto, elimino el archivo .cpp qe se crea y en el .h asigno las variables qe deseo usar en todos los formularios? e incluyo usado #include ".h" en cada formulario donde requiera esas variables?.
-----------------------------------------------------------

-----------------------------------------------------------
La declaración deberia ser en un public o serviria como indico la otra persona usando extern en los archivos fuentes donde las utilizare(el archivo fuente es el .cpp no?, me imagino que la declaración en el .cpp principal debe ser usando public o simplemente las declaro tipo_variable nombre luego de la inclusión de bibliotecas?),yo compre un libro de visual c++ pero no hablan nada de eso....
----------------------------------------------------------



-----------------------------------------------------------
no se cual es ese fichero al que te refieres... Sera el resource.h(ese archivo esta en blanco solo tiene texto informativo//)?
----------------------------------------------------------




----------------------------------------------------------
Si te es mas comodo responder hazlo entre las lineas punteadas dandole citar.

Muchas gracias a ambos, voy a probar ahora a ver si me funciona.



Cita:
Iniciado por Nivel7
pues en C++, aun para .NET no hay mayor problema que declarar tus variables como globales, ya que el C++.NET no te exige empaquetar todas tus declaraciones dentro de una clase.
generalmente se hace en el fichero.h que el Visual C++ crea por defecto cuando usas encabezados precompilados, ya que el mismo IDE te exige incluirlo en todos los ficheros de tu proyecto.

estas usando el Viasul C++.NET 7 o el 8??
si es el 8 que tipo de codigo estas generando, Nativo, CLR, pure o safe??
dependiento de esto puedes crear tu arreglo como un puntero a puntero, como un arreglo de 2 dimenciones o como un arreglo de punteros.

si estas usando safe o pure, tendras que usar la plantilla de clase array<>

donde el primer parametro es el tipo y el segundo las dimenciones.

aunque he visto que suelen usarlo como una array de array

array<array<int> >^ arreglo2D;

Saludos.
  #5 (permalink)  
Antiguo 15/07/2006, 02:02
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años, 7 meses
Puntos: 0
Bueno, generalmente los libros acerca del Visual C++ se concentran mas en como manejar el IDE y en el uso de las clases MFC, y no tanto en el lenguaje C++ en si. Yo te recomendaria que primero leyeras un libro que se enfoque totalmente hacia el lenguaje C++, y no tanto uno que hable sobre un compilador en particular. Uno excelente es el del creador del lenguaje C++, Bjarne Stroustrup, el cual se llama El Lenguaje de Programacion C++, y me parece que ya va en su tercera edicion.

Precisamente en ese libro una recomendacion como regla practica es que evites en lo posible el uso de variables globales. Pero si eso es lo que quieres puedes probar a hacer un ejemplo sencillo para que te des cuenta como funciona.
En el IDE del Visual crea un proyecto en modo consola totalmente vacio. Agregale al proyecto un archivo .cpp con el siguiente codigo
Código:
#include <stdio.h>

extern int nGlobal;
void f ();

main ()
{
   extern int nGlobal;
   void f();
   void g();

   printf ("El valor de la variable global nGlobal es %d\n", nGlobal);
   nGlobal *= 10;
   f ();
   g ();
   f ();
}
Agregale al proyecto otro archivo .cpp con el siguiente codigo
Código:
int nGlobal = 10;

void f ()
{
   printf ("Funcion f(): El valor de la variable global nGlobal es %d\n", nGlobal);
}

void g ()
{
   int nGlobal = -1;
   printf ("Funcion g(): El valor de la variable global nGlobal es %d\n", nGlobal);
}
corre el programa para que veas los resultados.
En el primer archivo repeti la misma linea con extern y con la declaracion de la funcion f () solo para que veas que no importa el que lo hagas varias veces. Tambien defini en la funcion g () de nuevo la misma variable nGlobal para que veas que esto no es un error y que la variable local oculta a la global cuando tiene el mismo nombre, de manera que el modificar a la local no afecta para nada a la global. Una de las razones por las cuales se aconseja evitar el uso de variables globales es que accidentalmente cambies su valor o que quieras cambiar su valor pero la variable este oculta por otra con el mismo nombre. Esto en pequeños programas se detecta facilmente, pero piensa en un proyecto grande, donde intervienen varias personas en su desarrollo, con miles o millones de lineas de codigo, entonces ahi se complicaria mas el detectar esto. Una manera de evitar esto es crear una variable miembro estatica en una clase, asi, al usarla o modificarla tendrias que anteponer el nombre de la clase, por lo que dejarias explicitamente tu intencion de lo que quieres hacer sin la posibilidad de que otra persona la modifique accidentalmente o este oculta por otra. Aqui esta un ejemplo. Modifica el proyecto anterior o crea uno nuevo similar y en un archivo pon
Código:
class COtraClase {
public:
	void Modifica (int valor);
	int Muestra ();
};

class CPrueba {
public:
   static int nGlobal;
};

main ()
{
	printf ("Valor de la variable nGlobal: %d\n", CPrueba::nGlobal);
	CPrueba::nGlobal *= 10;
	printf ("Valor de la variable nGlobal: %d\n", CPrueba::nGlobal);

	COtraClase oc;
	printf ("oc.- Valor de la variable nGlobal: %d\n", oc.Muestra ());
	oc.Modifica (10);
	printf ("oc.- Valor de la variable nGlobal: %d\n", oc.Muestra ());

	CPrueba cp1, cp2;
	printf ("Valor del miembro nGlobal del objeto cp1: %d\n", cp1.nGlobal);
	cp1.nGlobal = 20;
	printf ("Valor del miembro nGlobal del objeto cp2: %d\n", cp2.nGlobal);
}
y en el otro
Código:
class COtraClase {
public:
	void Modifica (int valor);
	int Muestra ();
};

class CPrueba {
public:
   static int nGlobal;
};

int CPrueba::nGlobal = 10;

int COtraClase::Muestra () {
	return CPrueba::nGlobal;
}

void COtraClase::Modifica (int valor)
{
	CPrueba::nGlobal *= valor;
}
correlo y ve los resultados.
Cuando declaras un miembro de una clase como estatico, este miembro es comun a todos las instancias de la clase y no se crea una copia particular para cada objeto como es lo comun. Es por eso que al crear dos objetos distintos de la misma clase CPrueba, el modificar el miembro nGlobal en una, automaticamente se refleja este cambio en el miembro nGlobal del otro objeto.

Cuando declaras un miembro como estatico en una clase, no se reserva ningun espacio en memoria para el, por lo que necesariamente tienes que definirlo en alguna parte de tu programa. Esto lo hice en el segundo archivo en la linea
Código:
int CPrueba::nGlobal = 10;
  #6 (permalink)  
Antiguo 15/07/2006, 13:52
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
Cita:
Iniciado por SombraK
Saludos, la versión que estoy usando es la 8 y he procurado usar solo CLR, Cree usando una plantilla de aplicación CLR para windows, probe definiendo las variables en el .CPP que se creo junto al proyecto.
-------------------------------------------------------------------
Cuadno tu proyecto es grande(de varios archivos), lo ideal es hacer todas las declaraciones en los ficheros.h, aun en C++.NET.
en los ficheros.cpp solo impelemntarias.

cuando hay variables, constantes o funciones comunes a todos los ficheros se crea un fichero.h comun a todos los ficheros .cpp

-------------------------------------------------------------------
Funcionaria si agrego una clase al proyecto, elimino el archivo .cpp qe se crea y en el .h asigno las variables qe deseo usar en todos los formularios? e incluyo usado #include ".h" en cada formulario donde requiera esas variables?.
-----------------------------------------------------------
si a eso es a lo que me refiero, y de hecho puedes usar el fichero stdafx.h este es para el uso de encabezados precompilados.
-----------------------------------------------------------
La declaración deberia ser en un public o serviria como indico la otra persona usando extern en los archivos fuentes donde las utilizare(el archivo fuente es el .cpp no?, me imagino que la declaración en el .cpp principal debe ser usando public o simplemente las declaro tipo_variable nombre luego de la inclusión de bibliotecas?),yo compre un libro de visual c++ pero no hablan nada de eso....
----------------------------------------------------------
la declaracion no se haria en un .cpp, ya que no es muy comun incluir ficheros .cpp. como ya te comente se hace en un .h incluido en todos los .cpp del proyecto, o al menos en aquellos que utilizaras tus variables
no tienen por que ser public, o extern.
una variable global en C++ por defecto es public y auto.(su ambito es global).
si la declaras extern tendras que declararla en cada .cpp


-----------------------------------------------------------
no se cual es ese fichero al que te refieres... Sera el resource.h(ese archivo esta en blanco solo tiene texto informativo//)?
----------------------------------------------------------


stdafx.h, cuando usas encabezados precompilados el compilador te exige que incluyas este fichero en todos los .cpp de tu proyecto.

----------------------------------------------------------
Si te es mas comodo responder hazlo entre las lineas punteadas dandole citar.

Muchas gracias a ambos, voy a probar ahora a ver si me funciona.
pues eso. puedes probar de una u otra forma .

Saludos.
  #7 (permalink)  
Antiguo 16/07/2006, 11:06
 
Fecha de Ingreso: julio-2006
Mensajes: 47
Antigüedad: 18 años, 5 meses
Puntos: 0
De acuerdo Gracias a todos ya por fin me funciono

para pitukilloloco: oye gracias por la info, sin embargo en lo que lei si quiero crear una aplicación que sea completamente CLR no debo usar esa biblioteca <stdio.h> y si no la incluyo no me funciona el printf. Sin embargo esa forma de estructurarlo a traves de una clase la voy a probar ya que el programa va a ser extenso, solo una parte va a ser desarrollada para efectos de mi tesis, luego se le agregaran nuevas funciones para qe sea mas completo. usando lo del extern me funciono ayer, pero me consegui con otra piedra en el camino, pero lo voy a poner en otro tema para que no se desvie este y le pueda servir a alguien mas.

Para nivel 7: estube probando con el archivo stdafx.h para asi eliminar de los archivos .h los include referidos a cada .h qe necesitarian, pero eso me fallo en mi formulario principal que es quien manejara los accesos a los demas formulariso para obtener datos, generar datos iniciales, generar la solución numerica y mostrar resultados. Mi hermano qe estudia computación me decia que me olvidara de crear .cpp .h y qe solo ene l .cpp hiciera todo(iqe para no enrrollarme), pero eso me parece una locura ya que el programa va a ser extenso en codigo y seria complicado irlo modificando sobre la marcha. Me parece lo mejor que este compuesto de varios archivos para su facil modificación. Por lo que veo voy a estar abusando un poco de ustedes ya que la ayuda qe consigo en la pagina de microsoft no especifica ciertas cosas.
  #8 (permalink)  
Antiguo 17/07/2006, 00:33
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
hay, pues en realidad no es nada dificil, es lo que te viene explicando
pitukilloloco, solo que el opta por las variables extern.

pero en si es lo mismo, una variable, constante, funcion o literal declarada en un fichero .h podra ser usada en todo aquel .cpp que se incluya ese fichero y su valor actual sera comun a todos.

no es mas que eso. vamos que una variable declarada fuera de una funcion en una variable global a tu programa.

si quieres hacer esto un poco mas seguro puedes usar espcios de nombres.

ejemplo:

En el fichero .h de tus variables globales.

#ifndef VARS_H
#define VARS_H

namespace MyVars
{
int total;
int ultimo;
//etc....
}
#endif

para usar estas variables solo incluyes vars.h


En MainForm.cpp

//incluir antes todo lo de .NET o windows.
#include....
#include "vars.h"

MyVars::total = 1;
MyVars::ultimo = 1;
MyVars::ect.......


y si en otro Form quieres saber cual fue el ultimo valor solo tienes que hacer lo mismo.

MasForm

#include "vasr.h"

int otroTotal = MyVars::total;
int otroUltimo = MyVars::ultimo;

etc....

este es el mismo resultado que si usaras una clase con miembros estaticos.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 18:01.