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

Como hago para manejar arreglos de forma global en visual C++2005

Estas en el tema de Como hago para manejar arreglos de forma global en visual C++2005 en el foro de C/C++ en Foros del Web. En el programa que estoy desarrollando, necesito usar data la cual voy almacenando inicialmente en arreglos, sin embargo tengo el problema de qe estoy definiendo ...
  #1 (permalink)  
Antiguo 18/07/2006, 20:30
 
Fecha de Ingreso: julio-2006
Mensajes: 47
Antigüedad: 17 años, 10 meses
Puntos: 0
Como hago para manejar arreglos de forma global en visual C++2005

En el programa que estoy desarrollando, necesito usar data la cual voy almacenando inicialmente en arreglos, sin embargo tengo el problema de qe estoy definiendo los arreglos en ciertos eventos y cuando se genera otro evento no puedo usar ese arreglo creado previamente.

Pense en ir almacenando en un archivo de texto, pero eso creo qe va a ser muy complicado ya que incluso tendre qe manejar arreglos de arreglos.

Esto especialmente para generar varias mallas con diferente geometria.

Esto es en Visual C++ 2005 usando windows forms y comandos de CLR.
  #2 (permalink)  
Antiguo 19/07/2006, 00:56
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años
Puntos: 0
En un hilo anterior en este mismo foro te puse dos ejemplos de como puedes usar una variable global entera en un programa en C++ el cual se compone de varios archivos fuentes. Lo mismo se aplica a cualquiera otra variable que quieras hacer global, ya sea esta de uno de los demas tipos integrados (char, double, string, etc.) o cualquiera definido por el usuario usando arreglos, apuntadores o estructuras o cualquier combinacion de estas.

El problema que veo es que estas haciendo tu trabajo (de tesis, me parece que habias mencionado) en un lenguaje de programacion que nunca has usado (cuando mencionaste que tenias un hermano que estaba estudiando programacion al cual le preguntaste algunas cosas, deduzco entonces que no es lo que tu estudiaste) y en un entorno de programacion nada trivial, como es el Visual .NET 2005, para un principiante.

No es para desanimarte, pero si estas aprendiendo el lenguaje al mismo tiempo que estas haciendo tu trabajo de tesis veo muy dificil que vayas a acabarlo en un tiempo razonable, maxime que lo que estudiaste no es la carrera de programacion. Esta duda que tienes de compartir una variable global no tiene que ver con el entorno de programacion que estas usando (el Visual .NET 2005), sino con el lenguaje en si, y cualquier programador de C/C++ lo sabe, pues es una de las cosas que se aprende en la practica, y no tanto, leyendelo en algun libro. Pero si ahorita te salto esta duda, que no es muy complicada, entonces si te las vas a ver dificil cuando te salgan otra mas complejas, tanto del lenguaje en si como del entorno de programacion que estas usando. (Por cierto, no es necesario que pongas que tienes que hacer el programa usando comandos CLR, ya que los lenguajes que vienen con el IDE del Visual .NET, como el Visual Basic, Visual C++, Visual C# y Visual J# generan automaticamente codigo para el CLR, Common Language Runtime)
  #3 (permalink)  
Antiguo 19/07/2006, 09:51
 
Fecha de Ingreso: julio-2006
Mensajes: 47
Antigüedad: 17 años, 10 meses
Puntos: 0
Saludos pitukilloloco, probe definiendo de las formas qe me recomendaste en ese otro tema pero para las variables tipo arreglo me dice qe no se permite hacer eso, el error qe me da es que no se permite ese tipo de variable global en CLI(sino me equivoco ese cli va referido al clr)

Que no pueda hacer eso me trae el problema de que yo pensaba manejar la mayoria de la data generada automaticamente en arreglos.

Tu que tienes mas experiencia en eso te parece que entonces maneje la información atraves de archivos de texto, por lo menos para el caso de los arreglos?, ya ahi me tocaria preparar una clase para hacer eso ya qe seria en repetidas ocaciones que tenga que leer y/o escribir en los archivos de texto, desde varias parte del proyecto(dif. formularios).

Por lo que me dices voy a hablar en la empresa donde la ando haciendo a ver si ellos me averiguan eso, o sino les voy a proponer simplificar el programa, que en ves de generar todas las mallas a usar sea de 1 en 1 por lo menos para efectos de la tesis, asi seria mas facil manejar las lecturas y escrituras en archivo de texto.
  #4 (permalink)  
Antiguo 19/07/2006, 12:44
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años
Puntos: 0
¿Puedes poner exactamente la declaracion del o los arreglos que quieres usar globalmente y tambien los mensajes de error literales que te da el compilador?

Usar archivos como comunicacion entre procesos (o en este caso, en un mismo programa) seria una solucion, pero muy ineficiente, ya que el acceso a disco comparado con el de la memoria es de una magnitud muy grande en velocidad.

Me extraña eso que dices, pero solo viendo que errores exactamente te da el compilador y las variables que manejas podria opinar algo al respecto.
  #5 (permalink)  
Antiguo 19/07/2006, 13:38
 
Fecha de Ingreso: julio-2006
Mensajes: 47
Antigüedad: 17 años, 10 meses
Puntos: 0
El error que me muestra el compilador:

1>.\Geomecanica.cpp(19) : error C3145: 'Prueba4' : la variable global o estática no puede tener el tipo administrado 'cli::array<Type> ^'

esta es la declaración, esta en el .cpp principal :

// Geomecanica.cpp: archivo de proyecto principal.

#include "stdafx.h"

using namespace Geomecanica;
using namespace System::IO;


int Cnod,Cmech,aa; estos si funcionan sin ningun problema, sin embargo ya los coloque en un .h separado siguiendo sus sugerencias.

array<String^>^Prueba4= {L"4",L"5 1/4",L"3R",L"normal",L"3300"};

tambien probe:

array<String^>^Prueba4;

el error tambien ocurre asi use un arreglo de int.

Por eso que dices es que no habia intentado resolver el problema via archivo de texto, sin embargo por lo que hable con uno de mis tutores industriales hoy voy a preparar el programa para qe use archivos de texto para almacenar las mallas(sin embargo voy a crear una copia del proyecto, ya que la idea es crear la aplicación usando los arreglos globales, lo que quiere decir que si consigo ayuda con la creación de esos fulanos estaria trabajando en los 2 proyectos probablemente, el mas simple para efectos de mi tesis, ya que el programa con arreglos globales seria una herramienta muy util y facil de usar para un ing. perforador), claro lo hare para que se cree solo 1 malla por ejecución, ya que en principio el procedimiento para multiples mallas debe estar preparado para alojar a unas 100 o mas mallas compuestas cada 1 de cerca de 1000 o mas coordenadas.

Si tienes alguna sugerencia.
  #6 (permalink)  
Antiguo 19/07/2006, 21:49
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años
Puntos: 0
Aunque un arreglo de cadenas como
Código:
{"4", "5 1/4", "3R", "normal", "3300"}
es un arreglo de arreglo de caracteres, ya que cada cadena individual se compone de un arreglo de caracteres, en C/C++ generalmente se habla de lo anterior simplemente como un arreglo de cadenas, ya que al manejar estas se tratan como una unidad, utilizandose raramente los caracteres individualmente.

La manera mas comun de declarar un arreglo de cadenas y al mismo tiempo inicializarlo en C (lo cual aplica tambien a C++) es
Código:
char *arr_str[] = {
   "4",
   "5 1/4",
   "3R", "normal",
   "3300"
};
en C++ puedes usar el tipo string (no es un tipo integral del lenguaje, pero ya se ha vuelto estandar y para todos los efectos lo puedes tratar como tal, simplemente hay que incluir #include <string> para poder usarlo), y poner
Código:
string arr_str[] = {
   "4",
   "5 1/4",
   "3R", "normal",
   "3300"
};
o poniendo explicitamente del nombre de espacio de donde procede
Código:
std::string arr_str[] = {
   "4",
   "5 1/4",
   "3R", "normal",
   "3300"
};
Si en tu programa solo vas a usar las cadenas y no modificarlas, podrias definir las cadenas como recursos (de la misma manera que agregas elementos como cajas de texto, cajas combos, botones, etc.), de esta manera, el programa solo solicitaria memoria para ellas al momento de usarlas, lo cual es mejor a ponerlas directamente en el codigo de tu programa, por lo cual siempre van a estar en memoria mientras el programa este en ejecucion. Otro beneficio es que si despues modificas las cadenas, no tienes que tocar el codigo del programa para nada.

Para no hablar solo en el aire, cree un proyecto Windows Form usando C++ (con el .NET 2003, no creo que cambie mucho con el 2005). Le puse dos formularios. En uno defini el arreglo de cadenas que pusiste usando string y en el otro hice uso de este arreglo por medio de extern sin ningun problema.

Eso que pusiste de
Código:
array<String^>^Prueba4
pues no se de donde lo sacaste. Lo parentesis triangulares <> se usan para los patrones, pero para definir arreglos solo se usan los parentesis cuadrados [] y el caracter ^ solo he visto usarlo como el operaor OR Exclusivo a nivel de bits.
  #7 (permalink)  
Antiguo 19/07/2006, 23:20
 
Fecha de Ingreso: julio-2006
Mensajes: 47
Antigüedad: 17 años, 10 meses
Puntos: 0
para definir los arreglos tiene qe ser usando

array<tipo de variable>^ nombre; es para que no tenga tamaño definido

pero los use mas qe todo en el codigo que tengo qe dividir asi:

array<int>^ malla=gcnew array<int> (cantidad de valores);

asi me funcionaron en los eventos y asi es como sale qe ay qe declararlos en el libro qe tengo.

ya es tarde pero mañana voy a hacer pruebas con lo que me pusiste, los datos qe estaria en los arreglos podria ser modificada, por elección del usuario. Dependiendo de lo qe me ocurra con el programa vuelvo a escribir aca, gracias por tu tiempo pana.

Hasta luego.
  #8 (permalink)  
Antiguo 20/07/2006, 00:43
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
por lo que veo no sabes programar Orientado a Objetos, preguntas como esta me hacen pensar esto(sin la intencion de hacerte menos).

solo que variables globales en C++.NET es muy raro, C++ te permite eso, pero lo recomendable es no usarlas.

para hacer lo que tu quieres hacer es sufuciente declarar tu array como una variable miembro de tu clase e inicializarlo en el constructor de la clase.


class Ejemplo
{
private:
array<int>^ vector;

public:
Ejemplo()
{
vector = gcnew array<int>(1,2,3,4,5,6,7,8,9);//un ejemplo.
}

//ya en tu evento o cualquier otra funcion lo puedes usar.

void UnaFuncion(int x, int y)
{
vector[0] = x;
vector[1] = y;
}

};

para poder compartir tus datos del vector, puedes usar una propiedad o una funcion Get-Set.

Saludos.
  #9 (permalink)  
Antiguo 20/07/2006, 11:46
 
Fecha de Ingreso: julio-2006
Mensajes: 47
Antigüedad: 17 años, 10 meses
Puntos: 0
Epale, ya qu eme dices que es raro usar en .net las variables globales, entonces como hago para manejar entrada de datos en un formulario, luego usar esos valores entrados para limitar calculos en otro formulario, asi como generar cientos de coordenadas y que estas esten disponibles para usarlas en cualquier parte del proyecto. Yo nose, pero por ejm para las coordenadas la unica forma qe veo es atraves de un arreglo global o de un archivo. De esos 2 me parece mejor opción el arreglo global asi como me decia pitukilloloco.

Si conoces alguna pagina sobre como hacer esto de otra forma(sin arreglos globales) si quieres me la colocas para ir a revisarla.

respecto a lo qe tu me dice: para hacer lo que tu quieres hacer es sufuciente declarar tu array como una variable miembro de tu clase e inicializarlo en el constructor de la clase.

vale crear un archivo de encabezado .h y declarar ahi la clase como tu me la pones o tiene que ser una clase creada en el formulario donde va a ser usada?. Bueno igual ya mi hermano se desocupa de clases asi qe ya tengo material con lo qe ustedes me han escrito para ver si el me termina de ayudar.



Cita:
Iniciado por Nivel7
por lo que veo no sabes programar Orientado a Objetos, preguntas como esta me hacen pensar esto(sin la intencion de hacerte menos).

solo que variables globales en C++.NET es muy raro, C++ te permite eso, pero lo recomendable es no usarlas.

para hacer lo que tu quieres hacer es sufuciente declarar tu array como una variable miembro de tu clase e inicializarlo en el constructor de la clase.


class Ejemplo
{
private:
array<int>^ vector;

public:
Ejemplo()
{
vector = gcnew array<int>(1,2,3,4,5,6,7,8,9);//un ejemplo.
}

//ya en tu evento o cualquier otra funcion lo puedes usar.

void UnaFuncion(int x, int y)
{
vector[0] = x;
vector[1] = y;
}

};

para poder compartir tus datos del vector, puedes usar una propiedad o una funcion Get-Set.

Saludos.
  #10 (permalink)  
Antiguo 20/07/2006, 15:35
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
hay, hay, hay, suena a reto, jeje, mas que a peticion, pero en fin ahi tienes a todo el Framework de .NET totalmente Orientado a Objetos y como se supone que esta escrito en C# es logico que no hacen uso de variables globales y ve creo que funciona.

para eso estan las propiedades publicas, para compartir imformacion entre un objeto y otro, tambien puedes usar metodos, Get-Set, si queres optimizar puedes usar metodos inline. no comprendo por que te apegas a las variables globales.

una clase puede tener estos vectores como miembros estaticos, como hace Visual Basic con sus modulos, o simplemente hacerlos miembro del Form principal y que este los comparta con sus forms hijos.

enfin.

no puedo darte una pagina, solo te recomiendo revisar la Programacion Orientada a Objetos.

Saludos.
  #11 (permalink)  
Antiguo 23/07/2006, 15:48
 
Fecha de Ingreso: julio-2006
Mensajes: 47
Antigüedad: 17 años, 10 meses
Puntos: 0
epale pana, oye de momento me dedique ha hacer el codigo para 1 sola malla a la vez. De hecho hoy cree mi primer .dll ya que estoy viendo qe para actualizar el programa es mas facil, en el caso de qe los cambios sean de valores de su base de datos, simplemente sustituir los .dll

en los fulanos .dll cree arreglos de String^ y Double, en el qe tengo listo voy a incluir parte de un catalogo comercial de mechas de perforación, logre vincular despues de tanta paridera jajaja el control comboBox para qe muestre la cantidad de elementos qe estan en el .dll y luego cuando se selecciona uno de los elementos se copia el valor de la mecha del .dll y se almacena en la variable global correspondiente, no es por nada pero si pudiese trabajar todo con variables globales(arreglos) hubiese sido todo perfecto.

Con lo de los objetos no me he metido mucho, el combobox usa un array de objetos.... menos mal qe dentro de todo pude configurarlo sin tanto rollo.

Por cierto tengo warning de posible perdida de datos por conversion de double a int, en ese caso son indices es decir los numeros en double son puros enteros, conoces forma de transformar el valor?.

Es decir un double a int?.

Ya al fin estoy listo para meter el codigo de generación de malla en el programa, me parece qe tambien lo voy a hacer por medio de un .dll ya que en este momento el codigo solo genera coordenadas para 1 solo tipo de elemento y luego quiero cambiar eso tambien.

De pana que gracias a todos ustedes por el apoyo, lo qe he estado haciendo casi no tiene qe ver nada con lo qe yo vi en programación jajajaja, pero bueno yo no soy estudiante de computación asi qe bueno tanpoco me ha ido tan mal, jajaja bueno eso creo.


Cita:
Iniciado por Nivel7
hay, hay, hay, suena a reto, jeje, mas que a peticion, pero en fin ahi tienes a todo el Framework de .NET totalmente Orientado a Objetos y como se supone que esta escrito en C# es logico que no hacen uso de variables globales y ve creo que funciona.

para eso estan las propiedades publicas, para compartir imformacion entre un objeto y otro, tambien puedes usar metodos, Get-Set, si queres optimizar puedes usar metodos inline. no comprendo por que te apegas a las variables globales.

una clase puede tener estos vectores como miembros estaticos, como hace Visual Basic con sus modulos, o simplemente hacerlos miembro del Form principal y que este los comparta con sus forms hijos.

enfin.

no puedo darte una pagina, solo te recomiendo revisar la Programacion Orientada a Objetos.

Saludos.
  #12 (permalink)  
Antiguo 23/07/2006, 15:50
 
Fecha de Ingreso: julio-2006
Mensajes: 47
Antigüedad: 17 años, 10 meses
Puntos: 0
.......ok la ayuda de visual c++ ahora si como qe esta colaborando ya vi como hacer la conversión


(int c)=System::Convert::ToInt32(double a);
  #13 (permalink)  
Antiguo 25/07/2006, 16:30
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
para el manejo de coordenadas mejor que arrays usa estructuras o en su caso array de estructuras punto.

EJemplo:

value struct MPunto
{
int x;
int y;
};

array<MPunto>^ vector = gcnew array<MPunto>;


usar variables globales en DLL's, no estoy seguro como se manejen las variables globales, pero no creo que sea buena idea, ya que estas variables no solo seran globales a tu aplicacion si no a todas las aplicaciones en ejecucion.

en realidad no es algo muy complicado, tan solo estudia un poco el tema de las propiedades.

o en su caso el uso de clases con miembros estaticos.


yo haria:

class MVector
{
public:
static array<MPoint>^ data;
};

srray<MPunto>^ MVector::data = 0;

class MainForm: public Form
{

MainForm()
{
MVector::data = gcnew array<MPunto>(//etc...);

//inicializas el vector y ya tendra datos para poder ser usado en otros formularios, .

la estructura MPunto y la clase MVector estaran en el mismo .h y cual sera incluido en todos los formularios que utilicen el vector.
}
};
  #14 (permalink)  
Antiguo 25/07/2006, 19:47
 
Fecha de Ingreso: julio-2006
Mensajes: 47
Antigüedad: 17 años, 10 meses
Puntos: 0
Epale pana probe colocando lo que me dices en un .h y este a su vez lo inclui en un formulario y me da varios errores.... sera qe para eso necesito incluir alguna otra bibioteca? probe colocandole los using namespace system y nada...

Al final use las variables globales para algunos double y int a traves de un archivo .h asi para usarlas tengo qe hacer referencia al namespace qe las contiene, tal como me dijeron entre ustedes.

1> no puede declarar una variable global o estática, o un miembro de un tipo nativo que hace referencia a objetos del montón gc
1>d:\tesis de grado\geome-malla-unica\geome-malla-unica\geome-malla-unica\geome\geomecanica\prueba-1.h(10) : error C2143: error de sintaxis : falta ';' delante de '<'
1>d:\tesis de grado\geome-malla-unica\geome-malla-unica\geome-malla-unica\geome\geomecanica\prueba-1.h(10) : error C4430: falta el especificador de tipo; se presupone int. Nota: C++ no admite default-int
1>d:\tesis de grado\geome-malla-unica\geome-malla-unica\geome-malla-unica\geome\geomecanica\prueba-1.h(12) : error C4959: no se puede definir class 'MainForm' no administrado en /clr:safe porque el acceso a sus miembros proporciona código que no se puede comprobar
1>d:\tesis de grado\geome-malla-unica\geome-malla-unica\geome-malla-unica\geome\geomecanica\prueba-1.h(13) : error C3625: 'MainForm': un tipo no administrado no puede derivar de un tipo administrado 'System::Windows::Forms::Form'
1> c:\windows\microsoft.net\framework\v2.0.50727\syst em.windows.forms.dll : vea la declaración de 'System::Windows::Forms::Form'
  #15 (permalink)  
Antiguo 26/07/2006, 15:28
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
claro que tienen errores.
solo era una sugerencia y el codigo no es real.

a las clases tienen que agregar ref class o value class segun quieras usarla.
tamb tinene que verificar que la declaracionde los array sea correcta y si es necesario que una variable static sea asignada en el espacio de fichero como se hace en C++ nativo.
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




La zona horaria es GMT -6. Ahora son las 15:59.