C/Visual C - Duda existencial

 
Vista:

Duda existencial

Publicado por Nelek (816 intervenciones) el 07/06/2006 09:20:11
Hola a todos,

Alguien sabe si se puede crear o asignar variables de forma dinamica en VC++ 6????

Dicho en ejemplos:

Si tengo 20 variables pero solo le quiero cambiar el valor a las que cumplan cierta condicion... seria valido?
for (int i = 0; i < limite; i++)
{
if (condicion == true)
"variable"+i = nuevo_valor;
//si la condicion se cumple para i ==7 que sea <variable7> la que se modifique, si i == 5 <variable5>
}

O creando nuevos elementos.

for (int i = 0; i < limite; i++)
CBitmap "Bitmap"+i;

************************************************

Por ejemplo en Actionscript (Flash) quedaria:
for (int i = 0; i < limite; i++)
{
if (condicion == true)
_root["variable"+i] = nuevo_valor;
//si la condicion se cumple para i ==7, <variable7> = nuevo_valor; si i == 15, <variable15>
}

o

for (int i = 0; i < limite; i++)
_root.CreateEmptyMovieClip (_root["MovieClip"+i], i)
//daria MovieClip1, MovieClip2... MovieClip+limite; en las capa de profundidad "i" siendo el mas visible el ultimo en crearse.

COMO SE HARIA EN VC++????????????
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Duda existencial

Publicado por Juan (68 intervenciones) el 07/06/2006 14:14:38
No creo que mi respuesta te guste.... La verdad nose si se puede hacer eso, pero dentro de los patrones a nivel de programacion existe una norma (por llamarlo asi) bastante simple, que establece que si vas a tener multiples variables de un mismo tipo de dato (o incluso no sabes cuantas tendras en tiempo de ejecucion pero son varias), lo mas comodo es almacenarlas en un clase contenedora, es decir, una lista, una pila, una cola o un dipolo.

Ahora por otro lado tratando de recordar las fases de compilacion del lenguaje etc, creo que eso tampoco se puede hacer. Porque cuando el compilador va a chequear la validez del la linea de codigo se encuentra con una variable que a lo mejor no existe, que no es el mismo caso que ocurre con los arreglos. El sabe que los arreglos son zonas contiguas es memoria, sino arroja una excepcion (como en el caso de C) sencillamente sobreescribe la posicion del arreglo aunque este fuera del espacio de vida del arreglo. Pero si el compilador no encuentra la variable? Donde la deja? y que tipo de excepcion arroja? Las variables no identificadas deben reconocerse en fase de compilacion, no en fase de ejecucion. Ojo solo estoy aplicando mi logica a nivel de compilacion. Como te dije en un principio nose si el lenguaje hace eso, aunque si lo hace me gustaria saber como resolvio lo que deje en este parrafo.

Espero que esto te ayude a encontrar una respuesta para tu angustia filosofica jejjejeje
Juan
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por Nelek (816 intervenciones) el 08/06/2006 10:41:41
Hola de nuevo, (te voy siguiendo los pasos :P)

A ver, mi problema está en que parte de tu respuesta ya la sabía y la otra me ha dejado chafado. Voy a ver si especificando algo mejor lo que quiero...

La cosa está en que ya estoy usando listas y listas anidadas dentro de ellas para lo que son las "Variables de datos" que me interesa guardar. Y si, las listas son mu majas y ahorran mucha faena (cuando logras hacerlas funcionar claro está, yo he tenido que hacer verdaderas virguerias y menos mal que encontre una "template" de una lista inteligente que me soluciono la papeleta de las listas anidadas, que si no...) y te soluciona el tema de asignacion dinamica de memoria para guardar los datos y la redistribucion de sus miembros para añadir o borrar elementos.

La cosa está en que, para introducir los datos, uso una jerarquia de dialogos donde se especifican valores por defecto que solo pueden ser cambiados por el usuario (ya me he preocupado de capar al maximo las posibilidades de fallos en la introduccion de datos). Y una vez están todos los datos introducidos y guardados... es cuando llega mi problema.

Mi intencion es crear tantas CListBox como variables de entrada conectadas a un regulador tengo. Dentro de cada CListBox quiero meterle tantas lineas de opcion como atributos tiene cada una de las variables conectadas. Y para finalizar, quiero poder hacer una matriz cuadrada (con el numero maximo atributos que haya en las entradas conectadas) para poder combinar las posiciones donde se cruzan los atributos de las entradas consideradas en ese momento e introducir operadores que me lleven el control.

Lo de la matriz, va a ser muy largo, pero lo tengo claro. Y la grafica que tengo que hacer despues, lo mismo. Pero, los controles...

La unica manera que se me ocurre de hacerlo "dinamico" para que se adecue al numero de variables o de atributos de cada variable era como describo arriba. Es decir un bucle de 0 al limite superior de la lista, y asignar un nombre que varie solo en un numero al final (coincidiendo con la posicion de la lista que se contempla). Ya que tengo 24 entradas, 12 salidas y 12 reguladores de maximo con su respectivos 7 atributos maximos para las E/S, cada "señal" se puede conectar a todos los reguladores y cada regulador se puede conectar a todas las "señales".

Resumiendo, el tema de variables lo tengo solucionado , la grafica tambien, lo unico que necesito es crear CONTROLES (botones, listbox...) dinamicamente pero no escribiendo 24*12*7 o 12*12*7 veces el codigo completo de creacion de controles para luego decirles visible o invisible, enabled o disabled... segun llegue al maximo de la lista o no.

P.S: Estoy empezando a odiar Windows :P
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por Juan (68 intervenciones) el 08/06/2006 15:30:33
Ok, pero entonces porque no creas un arreglo de controles y los tratas con estructuras iterativas (ojo aun estoy digiriendo un poco lo que dices). Ademas creo que asi la programacion de los eventos esmas simple porque tienes un direccionamiento logico entre controles mediante los indices. Voy a seguir leyendo, y entiendo lo que planteas o si te sirve lo que te digo, seguimos posteando.
PD: Yo odio Windows, pero aborrezco linux, asi que no queda de otra jejeej
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por Nelek (816 intervenciones) el 08/06/2006 15:48:49
Si es que lo que quiero evitar es precisamente eso. Lo de tener que crearme un Vector en tiempo de diseño que contenga todas las posibles variantes y luego ponerle enabled, visible y los demas parametros según convenga. Por eso preguntaba lo de la creacion y asignacion dinamica.

Por ejemplo (a ver si me explico mejor):

Tengo una lista de Entradas (cuantas, depende del usuario que esta utilizando el siulador en ese momento y el esquema que quiera simular) cuyo maximo es 24. Cada una de las entradas tiene otra lista con Atributos cuyo maximo es 7.

Otra lista de maximo 12 salidas con su sublista de 7 atributos como maximo

y otra lista de reguladores con maximo 12, cuya sublista de operadores depende de:

Que entradas tiene conectada, que atributos tiene cada entrada, que salidas tiene conectadas y que atributos tienen las salidas. Por lo que si ponemos el peor de los casos (todos los maximos) para 1 UNICO regulador necesitaria
24 listbox de 7 lineas para las entradas
12 listbox de 7 lineas para las salidas
24*7 botones repetidos 12*7 veces para establecer los puntos de conexion y su factor de relacion ya que segun las entradas, sus atributos y el valor del punto de trabajo, se establece un valor para uno de los atributos de salida.

Lo que yo intento es no tener que hacer 24*7 creaciones de boton en 12*7 vectores en tiempo de diseño.

En otros lenguajes que he usado (vease ActionScript de flash), para cosas asi yo hacia.
for (int i = 0; i < limite; i++)
{
_root.CreateEmptyMovieClip (_root["nombre"+i], i)
}

y con esto se me creaban tantos movieclips o botones como yo quisiera y cada uno de ellos en una capa de profundidad distinta para evitar ostias entre ellos. Luego ya cogia el que me daba la gana segun necesitaba por el mismo metodo
_root.nombre7 == _root["nombre"+7] == _root["nombre"+var] (donde var = 7)

Sinceramente, me sorprende que una "mierdecilla" como Flash tenga esas posibilidades y el "Microsoft" VC++ no. Pero claro, el que no sabe es como el que no ve... (o eso decia mi padre)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por Juan (68 intervenciones) el 08/06/2006 16:08:03
Dependemos de fernando en ese caso entonces.. Aunque creo que ese 24*7 debe tener alguna estrategia de optimizacion.... uhmmmm npi (not possible idea)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por fernando.gomez (1603 intervenciones) el 08/06/2006 17:38:17
>>Si es que lo que quiero evitar es precisamente eso. Lo de tener que crearme un Vector >>en tiempo de diseño que contenga todas las posibles variantes y luego ponerle >>enabled, >>visible y los demas parametros según convenga. Por eso preguntaba lo de >>la creacion y asignacion dinamica.

Pues crea el vector de forma dinámica, no en tiempo de diseño.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por fernando.gomez (1603 intervenciones) el 08/06/2006 17:43:54
>>Si es que lo que quiero evitar es precisamente eso. Lo de tener que crearme un Vector >>en tiempo de diseño que contenga todas las posibles variantes y luego ponerle >>enabled, >>visible y los demas parametros según convenga. Por eso preguntaba lo de >>la creacion y asignacion dinamica.

Pues crea el vector de forma dinámica, no en tiempo de diseño.

>>Sinceramente, me sorprende que una "mierdecilla" como Flash tenga esas >>posibilidades y el "Microsoft" VC++ no. Pero claro, el que no sabe es como el que no >>ve... (o eso decia mi padre)

Ayayay... una tormenta en un vaso de agua... Mira, ActionScript es un SCRIPT, un lenguaje de 4a o 5a generación. ActionScript es interpretado, por eso es que todo ese tipo de cosas las puede hacer. ¿Sabes por qué? Internamente, AS "parsea" todas las variables (que al igual que en tu caso no se sabe de antemano cuántas habrá) en un vector (más precísamente en un árbol binario para establecer jerarquías, pero bueno, para efectos prácticos imaginemos que es un vector). Las variables que tienes en AS es texto plano, y como es un lenguaje interpretado, no tiene que crearse memoria dinámica directamente, sino que el intérprete es el que se encarga de hacerlo. En C/C++, Java, etc, el compilador compila directamente -no crea vectores en memoria al ser interpretado-, por lo que dicha posibilidad queda enteramente eliminada.

Por eso, AS necesitas el motor de Flash, cuyo código -en C- es el que interpreta el script y lo traduce en los objetos Flash que todos conocemos. Mientras que C/C++ sólo necesitan el procesador.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por Nelek (816 intervenciones) el 08/06/2006 16:05:26
Acabo de caer en una cosa. Aun en el caso de que pudiera crear los dichosos controles... Como me las ingenio para hacer dinamicamente el "OnBut1" y demas?

Y en el peor de los casos... si me creo todos los controles del DlgBox y los hago invisible en tiempo de diseño... me tendria que crear tambien funciones de iteracion particulares para poder acceder a las propiedades necesarias... no?
Del rollo:

bool SetEnabled (POSITION pos, CButton cbBtn)

para decirle a cual de todos los botones le tiene que hacer que...

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHH

Que ganas tengo de acabar con esto....

Seguire con lo que aun me queda de la entrada y almacenaje de datos a ver si se me ocurre de manera espontanea y/o por inspiracion divina la manera de salir de este pantanal sin llenarme de mi...

Si alguien me puede echar una mano... Le estare eternamente agradecido y si quiere una cena o algo a cambio... creo que no haria ni falta el discutirlo, la tendria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por fernando.gomez (1603 intervenciones) el 08/06/2006 17:34:48
>>La unica manera que se me ocurre de hacerlo "dinamico" para que se adecue al >>numero de variables o de atributos de cada variable era como describo arriba. Es decir >>un bucle de 0 al limite superior de la lista, y asignar un nombre que varie solo en un >>numero al final (coincidiendo con la posicion de la lista que se contempla).

¿y por qué no empleas un array?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por fernando.gomez (1603 intervenciones) el 08/06/2006 17:20:21
No se puede hacer semejante horror en C, C++, Java o cualquier lenguaje que se precie de sí mismo. Para eso precísamente existen los vectores.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por Juan (68 intervenciones) el 08/06/2006 17:27:03
jejejejeejee como que no me pele en mi teoria de compiladores jejejjejej
Nelek, ahora te hago una pregunta. Los problemas que tenias en tu ultimo mail como los resuelves si usaras esas cosas que no se pueden usar? Igual tendrias que programar cada uno de los controles que vayas a usar, etc, etc, etc. El problema es el mismo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por fernando.gomez (1603 intervenciones) el 08/06/2006 17:50:53
Es que independientemente de que tu teoría de compiladores, como la comentas, es correcta, el problema es que lo que quiere Nelek carece completamente de sentido; como bien comentas, se pueden emplear arrays dinámicos, etcétera. Ritchie y Kerninham se rompieron la cabeza para incluir los vectores, precísamente solucionar el problema que tiene Nelek.

Ahora para solucionar el problema de los eventos... se puede hacer, pero de forma dinámica (para lo que se requiere saber qué hacen DECLARE_MESSAGE_MAP, BEGIN_MESSAGE_MAP y END_MESSSAGE_MAP), o bien heredas de CListBox o el control que estés creando dinámicamente, y sobreescribes el OnLButtonDown para el click, etcétera. Puedes hastsa emplear callbacks o enviarle mensajes de Windows a la ventana padre, si se quiere que ésta se comunique con la clase.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por Juan (68 intervenciones) el 08/06/2006 18:00:55
uhmmm tipo C#.... Interesing.
Creo que mas que un trabajo dificil, es un trabajo donde hay que sentarse con calma a buscar esos truquitos para terminarlo mas rapido. Con esos detalles te eliminas full la repeticion de codigo. Fernando algun tip adicional o pagina que conozcas que hablen un poco mas de eso si no es molestia?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por fernando.gomez (1603 intervenciones) el 08/06/2006 19:17:03
Mmm... realmente es difícil encontrar información al respecto. Yo comencé por ver las definiciones de los macros DECLARE_MESSAGE_MAP et. al., y con eso me enteré de que esos macros -al igual que otros como DECLARE_DYNCREATE etc- lo que hacen es crear variables y funciones (como _GetMessageMap) que después son llamados. Información al respecto supongo que habrá en www.msdn.microsoft.com. Yo aprendí de esto también cuando aprendí WTL, ya que ahí desmenuzan los macros, etcétera. Información que te pueda servir está en http://codeproject.com/wtl/#Beginners, en particular las series de Michael Dunn (WTL for MFC programmers).

Ahora, con respecto a la otra opción que sugerí, es la de derivar una clase. Esto no debería representarles problemas, siempre y cuándo empleen DIV/DDX para todo esto (es decir, intercambiar mensajes vía DoDataExchange). Para hacer un callback -los eventos de C#- tienes que crearte el "delegado":

typedef int (*FuncionDelegado)(UINT param1, double x, double y);

Y entonces te creas una variable (o ¿por qué no? un array de variables):

private:
typedef std::vector<FuncionDelegado> FuncionVtr;

FuncionVtr m_vtrFuncs;

public:
void AgregarEvento(FuncionDelegado pfn) {
m_vtrFuncs.push_back(pfn);
}

protected:
void OnLButtonDown(UINT nFlags, CPoint pt) {
FuncionVtr::iterator iterFn;

for (iterFn = m_vtrFuncs.begin(); iterFn != m_vtrFuncs.end(); ++iterFn)
{
(*iterFn)(nFlags, pt.x, pt.y);
}
}

De esta forma podrías avisarle a cualquier otra clase que el CListBox fué clickeado, y le pasas el parámetro que te venga en gana -en el ejemplo, le paso los parámetros que me regresa el OnLButtonDown.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda existencial

Publicado por Nelek (816 intervenciones) el 09/06/2006 09:47:47
Hmmm, no he entendido totalmente lo que has escrito, pero creo tener una idea.

La cosa es que, creo (aun no estoy seguro) que no voy a necesitar pasar mensajes a otras clases, solo dentro del propio dialog. Va a ser uno de los mas complicados de realizar, pero sigue siendo un dialogo que presenta datos para poder introducir mas datos todavia.

Al final voy a intentar usar una lista en lugar de un array (para aprovechar los metodos que tengo) y, en lugar de asignar un nombre distinto a cada boton, lo que hare sera añadirle un parametro que diga que "señal" esta representando y en lugar de recorrer la lista hasta encontrar el nombre del boton, seria recorrer la lista para encontrar el nombre de la señal que representa. Ya tengo mis propios metodos de BuscaEntradaLlamada (CString nombre) y cosas asi... asi que seria hacerles alguna que otra modificacion y me serviria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Gracias a ambos

Publicado por Nelek (816 intervenciones) el 09/06/2006 09:48:15
Muchas gracias a los dos. Por ahora me copio el hilo para poder leerlo cuando quiera y ver si puedo digerir bien vuestros mensajes. Mientras voy a seguir con lo otro que me queda por hacer antes de atascarme en esto. Y en casa ire haciendo pruebas con versiones mas basicas a ver si le cojo la mecanica al asunto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar