• Viernes 29 de Marzo de 2024, 14:22

Autor Tema:  ¿Hacer que el nombre de una variable cambie automáticamente?  (Leído 1721 veces)

Froicent

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
¿Hacer que el nombre de una variable cambie automáticamente?
« en: Miércoles 13 de Mayo de 2009, 08:47 »
0
Hola, mi duda es la siguiente. Quisiera saber si hay alguna forma de hacer que el nombre de una variable cambie automáticamente en caso de que se cumpla algo.
Me explico mejor, Por ejemplo tengo una variable "C" que es contador en un ciclo y otras que se llaman nivel0, nivel1 y nivel2 (las 4 son de tipo Integer).
Yo quisiera que pase lo siguiente:
 
For C=0 to 2
      nivelC=algo
      'Entonces en este momento el nombre de la variable nivelC sería nivel0
      'Es cero, porque ese es el valor que contiene la variable C en este momento.
      '...y cada vez que el ciclo de una vuelta la variable cambia de nombre.
      'De manera que en la segunda vuelta se llamaría nivel1.
Next

 ¿Hay alguna forma de que yo pueda hacer esto?, me disculpan si parezco muy ignorante, es que tan solo estoy comenzando en Visual Basic. Le hice la misma pregunta al profesor de la Universidad, pero lamentablemente no me supo responder. Mis más sinceras gracias para los que tomen un poco de su tiempo en leer mi pregunta y me ayuden a aclarar mi duda. Gracias.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: ¿Hacer que el nombre de una variable cambie automáticamente?
« Respuesta #1 en: Miércoles 13 de Mayo de 2009, 10:20 »
0
No le veo mucho sentido cambiarle el nombre a una variable.

En todo caso, lo tuyo se soluciona con vectores:

Código: Visual Basic
  1. Dim nivel(2) As Integer
  2.  
  3. For C=0 To 2
  4.     nivel(C) = algo
  5. Next C
  6.  
PD: te aconsejo que te pilles un buen libro de VB6 y empieces a estudiar y practicar

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: ¿Hacer que el nombre de una variable cambie automáticamente?
« Respuesta #2 en: Miércoles 13 de Mayo de 2009, 13:37 »
0
Después que leas a Moskito, quizás te parezca que no ha respondido exactamente a tus dudas, pero si lo que lo ha hecho, lo que pasa es que quizás no te lo haya explicaco bien, ypor eso pueda darte esa impresión.

Renombrar una variable no es posible porque su nombre es una propiedad de sólo lectura durante la ejecución. Por ejemplo el siguiente código da error en text1.name = ....
Código: Visual Basic
  1.  
  2. Private Sub Command1_Click()
  3.     Dim nombre As String
  4.     Dim c As Control
  5.    
  6.     nombre = Text1.Name
  7.     Text1.Name = Text2.Name                '  <--------------------  aquí dará error....
  8.     Text2.Name = nombre & "Cambiado"
  9.    
  10.     For Each c In Me.Controls
  11.         msxgbox c.Name
  12.     Next
  13. End Sub
  14.  
  15.  

 Sin embargo eso no supone ningún problema...
imagina Juan (que es un nombre tiene una mujer, una casa y un coche, pero no cualquier mujer ni casa ni coche, si uno una mujer específica y concreta, idem para el coche y la casa...
Desafortunadamente a Juan le persigue la policía el ve como solución cambiarse el nombre y lo hace y ya está sigue teneidno su mujer su casa y su coche, sólo cambió su nombre.
En programación esto también se puede hacer pero indirectamente, se llama asignación te pongo un ejemplo:

Código: Visual Basic
  1.  
  2. Private Type Persona
  3.     Mujer As String
  4.     Casa As Integer
  5.     Coche As Long
  6. End Type
  7.  
  8.  
  9. Dim Juan  As Persona
  10. Dim Pedro As Persona
  11.  
  12. Private Sub Command1_Click()
  13.     Me.Cls
  14.     Me.Print "La identidad de juan es, Mujer: " & Juan.Mujer & " Casa= " & Juan.Casa & " Coche: " & Juan.Coche
  15.     Me.Print "La identidad de Pedro es, Mujer: " & Pedro.Mujer & " Casa= " & Pedro.Casa & " Coche: " & Pedro.Coche
  16.    
  17.     Me.Print: Me.Print "Ahora cambiamos identidad, juan será pedro, y por tanto juan ya no tendrá ni mujer ni casa ni coche..."
  18.     Call CambiarIdentidad(Pedro, Juan, True)
  19.    
  20.     Me.Print "La identidad de juan es, Mujer: " & Juan.Mujer & " Casa= " & Juan.Casa & " Coche: " & Juan.Coche
  21.     Me.Print "La identidad de Pedro es, Mujer: " & Pedro.Mujer & " Casa= " & Pedro.Casa & " Coche: " & Pedro.Coche
  22.    
  23.     MsgBox "Observa los cambios... Cuando cierres este mensaje se cerrará la aplicación."
  24.     Unload Me
  25. End Sub
  26.  
  27. Private Sub Form_Load()
  28.     Me.AutoRedraw = True
  29.     Juan.Casa = 12
  30.     Juan.Coche = 2500
  31.     Juan.Mujer = "Teresa"
  32. End Sub
  33.  
  34.  
  35. ' p1 es la persona que recibe una nueva identidad
  36. ' p2 es la identidad que se 'ofrece'...
  37. Private Function CambiarIdentidad(ByRef p1 As Persona, ByRef p2 As Persona, Optional ByVal Vaciarp2 As Boolean = True)
  38.     Dim p3 As Persona
  39.     If Vaciarp2 = False Then
  40.         p3 = p1
  41.     End If
  42.     p1 = p2
  43.     p2 = p3
  44. End Function
  45.  
  46.  

Citar
¿Hay alguna forma de que yo pueda hacer esto?,....


Lo anterior (el código) qué quiere decir ?... que lo que se hace es una signación del valor de una variable a otra, la que recibe la signación 'toma plenos poderes' de la identidad del que se le asigna, para que hablemos de un cambio total de nombre, sería acorde anular la identidad del que 'dona' su identidad... como esto puede ser o no necesario nunca se hace en programación que esto ocurra por defecto, por eso en programación si no destruimos al dona la identidad o si no le quitamos su identidad a otra diferente, podemos hablar de 'clones' de identidad. en el mundo no hay 2 personas que llamándose iguales tengan la misma casa, la misma mujer y el mismo coche, en programación esto no supone ningún problema.

Por tanto cuando quieras cambiar el nombre de una variable, simplemente usa otra a la que le asignes su 'identidad' (valor ), si necesitas seguir llamándola de la misma forma, ya no le estás cambiando el nombre si sin enbargo necesitas poder referirte a la misma entonces haz como te señala Mosquito, usa una matriz o cualquier otro contendor de variables... objeto colection, etc...

Citar
Le hice la misma pregunta al profesor de la Universidad, pero lamentablemente no me supo responder.
Al pronto quizás no entendió adónde querías ir a parar, pero a buen seguro que sabe que el nombre de una variable es de sólo lectura después de creada. cuando una variable se crea, internamente el nombre se alamacena en un espacio del programa reservado a los identificadores, el nombre en sí es lá intermediación entre la memoria y nuestra inútil capacidad para recordar posiciones de mmmemoria que cambian con una velocidad que no poddríamos seguir... si por ejemplo nuestra variable se guarda en 5634B89 y un instante después se guarda en 345678 no seríamos capaces de identificar ni recordar donde está y qué era... Entonces por eso existen los nombres de variables, para que no tengamos que recordar donde se encuentra un dato. cuando lo referenciemos, internnamente se localiza entre la tabla de identificadores la variable que hemos nombrado si existe recupera un valor que tiene, dicho valor es la posición en memoria, si cambia la posición de memoria, localiza al identificador en la tabla y actualiza la posición, de un modo transparente para nosotros.

Ahora vamos a trabajar con posiciones de memoria de nuestras variables, verás que sería un coñazo sólo tener que usar (no ua  recordar ) dichas posiciones...
Hemos variado ligeramente el código anterior... observa las diferencias que son añadidos
al ejecutar el código en la ventana aparecerán 2 lineas más con números que son posicion y punteros a posiciones de memoria.
Código: Visual Basic
  1.  
  2. Private Type Persona
  3.     Mujer As String  
  4.     Casa As Integer
  5.     Coche As Long
  6.     Perro As Boolean
  7. End Type
  8.  
  9.  
  10. Dim Juan  As Persona
  11. Dim Pedro As Persona
  12.  
  13. Private Sub Command1_Click()
  14.    
  15.     Me.Print VarPtr(Juan) & vbTab & VarPtr(Juan.Mujer) & vbTab & VarPtr(Juan.Casa) & vbTab & VarPtr(Juan.Coche) & vbTab & VarPtr(Juan.Perro)
  16.    
  17.     Me.Print "La identidad de juan es, Mujer: " & Juan.Mujer & " Casa= " & Juan.Casa & " Coche: " & Juan.Coche & " Juan tiene perro: " & IIf(Juan.Perro = True, "si", "no")
  18.     Me.Print "La identidad de Pedro es, Mujer: " & Pedro.Mujer & " Casa= " & Pedro.Casa & " Coche: " & Pedro.Coche & " Pedro tiene perro: " & IIf(Pedro.Perro = True, "si", "no")
  19.    
  20.    
  21.     Me.Print: Me.Print "Ahora cambiamos identidad, juan será pedro, y por tanto juan ya no tendrá ni mujer ni casa ni coche..."
  22.     Call CambiarIdentidad(Pedro, Juan, True)
  23.    
  24.     Me.Print VarPtr(Juan) & vbTab & VarPtr(Juan.Mujer) & vbTab & VarPtr(Juan.Casa) & vbTab & VarPtr(Juan.Coche) & vbTab & VarPtr(Juan.Perro)
  25.  
  26.     Me.Print "La identidad de juan es, Mujer: " & Juan.Mujer & " Casa= " & Juan.Casa & " Coche: " & Juan.Coche & " Juan tiene perro: " & IIf(Juan.Perro = True, "si", "no")
  27.     Me.Print "La identidad de Pedro es, Mujer: " & Pedro.Mujer & " Casa= " & Pedro.Casa & " Coche: " & Pedro.Coche & " Pedro tiene perro: " & IIf(Pedro.Perro = True, "si", "no")
  28.    
  29.    
  30.     MsgBox "Observa los cambios... Cuando cierres este mensaje se cerrará la aplicación."
  31.     Unload Me
  32. End Sub
  33.  
  34. Private Sub Form_Load()
  35.     Me.AutoRedraw = True
  36.     Juan.Casa = 12
  37.     Juan.Coche = 2500
  38.     Juan.Mujer = "Teresa"
  39.     Juan.Perro = True
  40. End Sub
  41.  
  42.  
  43. ' p1 es la persona que recibe una nueva identidad
  44. ' p2 es la identidad que se 'ofrece'...
  45. Private Function CambiarIdentidad(ByRef p1 As Persona, ByRef p2 As Persona, Optional ByVal Vaciarp2 As Boolean = True)
  46.     Dim p3 As Persona
  47.     If Vaciarp2 = False Then
  48.         p3 = p1
  49.     End If
  50.     p1 = p2
  51.     p2 = p3
  52. End Function
  53.  
  54.  

Verás que las direcciones de memoria de una estructura están una contniuación de la otra, esto es así para calcular fácilmente (ubicar y reubicar) la posición absoluta de un campo de la estructura como un valor relativo respecto del valor absoluto de la estructura. Fíjate que hay 4 bytes de diferencias, la razón es que ni siquiera son los valores reales a los datos, sino punteros  a los valores reales, por eso ves que si un string tiene 6 caracteres no podría ocupar la misma posición que si tuviera 20 caracteres, esto supondría modificar y reordenar el resto de campos de la estructura, eso se evita precisamente con los punteros, sólo se toca el lemento deseado, el cáclculo es más o menos: posición de memoria de la variable juan + (orden del campo a localizar * 4) por ejemplo casa sería mujer + 4, así preguntarle por Juan y preguntarle por Juan.mujer nos señala la misma posición...

Un último cambio, el campo mujer modifícalo ahora por este otro:
Código: Visual Basic
  1. Mujer As String  * 10
  2.  
ahora cuando ejecutes el código verás que la dirección de mujer ya no sólo no coincide con la de la estructura sino que se aleja bastante del resto... además ahora la posición que se indica para Juan.Casa es juan + 20
Lo dejo a tu sagacidad ver si tratas de entender que ha pasado....

Bueno, aunque parezca que esto no tenga nada que ver con tu pregunta orgininal, la respuesta es que sí, todo se basa en el control de la memoria, por tanto teorícamente sería posible localizar la tabla de símbolos encontrar el nombre de una variable y sustiruir el valor de la misma por los que a uno le diera la gana, sin embargo el 'sistema' lo interpretarñia como una vioación de acceso, es decir se supone que si se cambia el nombre de una variable posiblemente el código quede inutilizado y el propio 'sistema' tenga dificultades para interpretar el nombre por no decir que se habrían saltado los controles de verificación acerca del nombre... está duplicado ?, su tamaño está dentro de los límites ?, utiliza caracteres prohibidos ?, utiliza el nombre de una palabra clave del lenguaje que luego se interprete mal ?.. el compilador realizará conversión  de nombres de  variables, para optimizar espacio ?... estas y otras razones que te puedes imaginar son las razones por las que el nombre de las variables son de sólo lectura...

Espero que te resulte útil para entender detalles que seguro no te explicarán en ningún lado (por lo general).
«Ma non troppo»
----> ModoVacaciones = False<----