https://foro.gambas-es.org/viewtopic.php?f=1&t=6125
-----------------------------------
Shell
Sabado, 14 Enero 2017, 10:52

De Nuevo Con Las Variables De Clase
-----------------------------------
Buenos días!.

Voy a mostraros un ejemplo en el que usando una clase me da error y usando la misma clase con una leve variación, no.
Pero no logro del todo lo que quiero hacer.

Tengo la clase ContactoOld ( que es la errónea, o en la que lo hago mal ).
Estoy intentando averiguar los valores de las propiedades de los objetos de la clase añadidos a la variable de clase listacontactos.

[code linenumbers=false syntax=gambas]
Private $email As String
Private $nombre As String

Property email As String
Property nombre As String

Static Public listacontactos As New Variant[]

Public Sub _new(nom As String, ema As String)
  
  With Me
    .nombre = nom
    .email = ema
  End With
  
  ContactoOld.listacontactos.Add(Me)
  
End

Private Function nombre_Read() As String
  
  Return $nombre    
  
End

Private Sub nombre_Write(Value As String)
  
  $nombre = Value 
  
End

Private Function email_Read() As String
  
  Return $email
  
End

Private Sub email_Write(Value As String)
  
  $email = Value
  
End
[/code]

Procedimiento para probar.

[code linenumbers=false syntax=gambas]
Public Sub UsandoClaseContactoOld()
  Dim c1 As ContactoOld 
  
  c1 = New ContactoOld("Alberto", "alberto@gmail.com")
   
End
[/code]

Salida en la consola:

[quote]
gbx3: warning: circular references detected:
gbx3:     1 ContactoOld
[/quote]

Ahora la variación de la clase. Esta vez uso en la misma clase un método estático que llamo desde el constructor

[code linenumbers=false syntax=gambas]
Private $email As String
Private $nombre As String

Property email As String
Property nombre As String

Static Public listacontactos As New Variant[]

Public Sub _new(nom As String, ema As String)
  
  With Me
    .nombre = nom
    .email = ema
  End With
  
  Me.anade()
  
End

Private Function nombre_Read() As String
  
  Return $nombre    
  
End

Private Sub nombre_Write(Value As String)
  
  $nombre = Value 
  
End

Private Function email_Read() As String
  
  Return $email
  
End

Private Sub email_Write(Value As String)
  
  $email = Value
  
End

Static Public Sub anade()
  
  Contacto.listacontactos.Add(Me)  
  
End
[/code]

La llamada al procedimiento.

[code linenumbers=false syntax=gambas]
Public Sub UsandoClaseContacto()
  
  Dim c1 As Contacto 
  Dim c2 As Contacto
  Dim ctemp As Class
  
  c1 = New Contacto("Alberto", "alberto@gmail.com")
  c2 = New Contacto("Pedro", "pedro@yahoo.es")
  
  Print Contacto.listacontactos.Count
  Print Contacto.listacontactos[1]
  
  For Each ctemp In Contacto.listacontactos
    Print ctemp.Symbols
  Next
  
End  
[/code]

[quote]
2
(Class Contacto)
(String[] 0xb3a578)
(String[] 0xb3a578)
[/quote]

Son solo pruebas. Si ya me esta dando que contiene un array de string, con un bucle anidado se podría ver.

Ahora os muestro algo similar en Python. Prueba en la consola.

[code linenumbers=false syntax=python]
#!/usr/bin/env python3

class Contacto:
    todos_contactos = []

    def __init__(self, nombre, email):
        self.nombre = nombre
        self.email = email  
        Contacto.todos_contactos.append(self)

def main():
    pass

if __name__=='__main__': main()
[/code]

 [img]https://foro.gambas-es.org/files/images/768/capturaconsola_1484386224_102162.png[/img]

Si yo en Gambas usara algo como esto, con la clase instanciada en el objeto c1.
Os pongo al lado, el error que da:

[code linenumbers=false syntax=gambas]
 Print Contacto.listacontactos[0].nombre 'No es un objeto
 Print c1.listacontactos[0].nombre ' Contacto.listacontactos es static.
[/code]

Os adjunto el código en Gambas. Mas parece que añadió una clase y no un objeto de clase. 

Saludos


-----------------------------------
Shell
Sabado, 14 Enero 2017, 11:06

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
Si yo hiciera esto:

[code linenumbers=false syntax=gambas]
..
Dim ctemp As Class
..
For Each ctemp In Contacto.listacontactos
    Print ctemp.Symbols
    Stop
Next
[/code]

Puedo ver tanto las propiedades de la clase como parte de sus métodos.

 [img]https://foro.gambas-es.org/files/images/768/simbolosenlaclase.png[/img] 

Saludos


-----------------------------------
Shell
Sabado, 14 Enero 2017, 11:28

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
Por cierto.

Class.Simbol aunque en la ayuda dice que da una "colección", mas que una colección es un array.  :? 

[quote]
Property Read Symbols As String[]

Returns a collection of all the symbol names of a class.
[/quote]

Saludos


-----------------------------------
jsbsan
Sabado, 14 Enero 2017, 13:13

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
Shell:

El error en la clase ContactoOld:
[quote]gbx3: warning: circular references detected:
gbx3: 1 ContactoOld[/quote]

Se produce cuando gambas3 intenta cerrar el programa, y creo que es porque gambas3 no puede borrar la clase ContactoOld (o algo que esta dentro de ella) ya que esta siendo usada por otra variable.. Parece que  al usarla directamente en el constructor _new se produce ese enlace... Sin embargo cuando la usas llamando desde otro método (anade) , no se produce ese enlace.... es muy curioso

Si añades al código:
  ContactoOld.listacontactos = Null
Esa referencia circular, queda "rota", y ya no muestra el mensaje de advertencia.

Te adjunto el código corregido....


-----------------------------------
vuott
Sabado, 14 Enero 2017, 15:23

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
[quote user="jsbsan" post="36660"]
Si añades al código:
  ContactoOld.listacontactos = Null
Esa referencia circular, queda "rota", y ya no muestra el mensaje de advertencia.
[/quote]
[u]Óptima[/u] sugerencia.

Solo por mera curiosidad, es posible usar tambien la función externa "[color=#990000][i][url=http://man7.org/linux/man-pages/man3/exit.3.html]exit( )[/i][/color]" de la libreria dinamica "[i]libc.so.6[/i]".
En este caso la función externa debería ser declarada con [i]Extern[/i] y ser puesta en lugar de la raya "[i]ContactoOld.listacontactos = Null[/i]".


-----------------------------------
jguardon
Sabado, 14 Enero 2017, 15:35

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
Además, los accesos de lectura/escritura de las propiedades "email" y "nombre" deben de ser públicos.

Saludos


-----------------------------------
Shell
Sabado, 14 Enero 2017, 19:32

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
Julio:

Gracias, ya funciona. No tenía ni idea de que se necesitase esa liberación final.
Debe ser algo propio de Gambas.
En consola nunca había visto este tipo de errores. Tengo otros ejemplos que tengo 
que modificar ya que tienen el mismo problema usando estas clases.

Vuott:

Vaya, al final lo logré con ese método también.

[code linenumbers=false syntax=gambas]
Library "libc:6"

Extern exit() As Integer

Public Sub Main()

  UsandoClaseContactoOld()

End

Public Sub UsandoClaseContactoOld()

  Dim c1 As ContactoOld

  c1 = New ContactoOld("Alberto", "alberto@gmail.com")

  Print ContactoOld.listacontactos.Count
  Print ContactoOld.listacontactos[0].nombre

 exit()
  
  'ContactoOld.listacontactos = Null

End

[/code]

Se mezclaba el Exit() de Gambas . Y es que es en minúscula. Y en vez de libc:6
estaba usando el nombre completo de la librería. Claro que en un Linux de 64b hay dos:

[quote]
./x86_64-linux-gnu/libc.so.6
./i386-linux-gnu/libc.so.6
[/quote]

Jesús:

[quote]
Además, los accesos de lectura/escritura de las propiedades "email" y "nombre" deben de ser públicos.
[/quote]

Son accesible con la propiedad. ¿ Qué más necesitas que eso ?.   :roll: 
En el código que he mostrado de Python son públicas, claro.

Por cierto, estos ejemplos que estoy haciendo en Gambas son gracias al curso de Inicio práctico a la programación con Python 3.X,
de Jesús Conde.

[url=https://www.youtube.com/playlist?list=PLEtcGQaT56cj70Vl_C1qfUinyMELunL-N]Curso Inicio práctico a la programación con Python 3.X de Jesús Conde.

Saludos


-----------------------------------
v3ctor
Domingo, 15 Enero 2017, 23:37

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
jajaj siempre explorando shell!!
estoy esperando algún programa hecho por vos!!
a ver si nos sorprendes heee, ya tenes mas que suficientes herramientas para comenzar!!
jajjajaj

saludos


/me porque aún shell no ha hecho ningún programa? (para los chateros jajajaj)


-----------------------------------
Shell
Lunes, 16 Enero 2017, 01:28

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
v3ctor:

[quote]
me porque aún shell no ha hecho ningún programa? (para los chateros jajajaj)
[/quote]

 :mryellow: 

Cierto. Nunca acabo haciendo una aplicación de un tamaño considerado.
Es que intento siempre estar viendo diferentes cosas y es que la programación
abarca mucho. Parece no tener fin.

Digamos que me gusta conocer cosas , pero no me acabo de decidir en que emplearlas.
Al igual que la programación modular, que esta formada por muchas partes, tengo que ir
tomando cada parte y crear un todo.

Cuando haces una aplicación grande requiere mucho tiempo y una gran dedicación.
A medida que avanzo y leo me van asaltando otros y otros ejemplos, ocurrencias
que intento cazar al vuelo, para que no se me olviden me tengo que poner con ellos.
De una misma idea, surgen otras y así recursivamente.

Me gusta los ejemplos pequeños, que demuestran cosas interesantes.
Como son pequeñas funciones.

Saludos


-----------------------------------
v3ctor
Lunes, 16 Enero 2017, 16:19

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
pero shell no te enredes ni te ahogues en un vaso de agua.
la cosa es bien simple el programa se hace para solucionar un problema en concreto o hacer una tarea especifica.
si no programas nada tal vez no tengas la necesidad de resolver ningún problema o hacer alguna tarea importante.

así es como nacen los programas, ellos resuelven un problema en concreto.

para mi taller2015 por ejemplo me hace de ayudante administrativo jajjajaj.

saludos.


-----------------------------------
Shell
Lunes, 16 Enero 2017, 19:11

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
[quote]
para mi taller2015 por ejemplo me hace de ayudante administrativo jajjajaj.
[/quote]

 :mryellow: 

Bueno, la idea es de que nos ayudemos entre los que formamos la comunidad y quien lo necesite.
Que mejor que presentar una aplicación para comprobar el correcto funcionamiento y solucionar
los problemas que tenga. 

Es complicado cuando no se conoce la aplicación.
En el caso de Taller, lo que voy haciendo es ejecutarla y voy viendo los errores que van saliendo.

[quote]
así es como nacen los programas, ellos resuelven un problema en concreto.
[/quote]

Mi problema es que hoy estoy haciendo una cosa y en ese mismo momento se me esta ocurriendo hacer otra.
Ahora se me ha antojado hacer un menú lateral de una aplicación con opciones que se van a validar y que 
cada una de estas opciones tienen su departamento. Por otro lado estoy siguiendo el videotutorial de python 3.x 
de José Conde. Me he puesto a ver un poco los errores de tu aplicación Taller. Llega un momento que me pierdo
por el camino y me dejo cosas atrás.

He dejado aparcado temporalmente PyGame. También me había encaprichado de la creación de un bloc de notas,
pero lo quiero hacer que tenga un fondo de un cuaderno real, adaptar las letras a las líneas de la hoja. Y así,
para eso tengo que leer un ejemplo de Julio que usa un tipo de plantillas.  :roll: 

Saludos


-----------------------------------
vuott
Lunes, 16 Enero 2017, 23:13

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
[quote user="Shell" post="36673"]Se mezclaba el Exit() de Gambas . Y es que es en minúscula.[/quote]
En estos casos en Gambas es posible usar el nombre de la función con letra minúscula; pero la documentación oficial quiere que se debe utilizar un nombre ficticio, citando su nombre real con [i]Exec[/i] .

[i]Exemplum codicis[/i]:
[code linenumbers=false syntax=gambas]' void exit (int __status)
Private Extern nombre_fiticio(__status As Integer) in "libc:6" Exec "exit"[/code]

Esta raya dice a Gambas: " [i]Bueno, declaro una función externa que serà usada en el codigo con el nombre (fiticio) 'nombre_fiticio', y tiene un parametro de tipo Integer, y está en la libreria 'libc.so.6' y su real nombre es: exit[/i]  ".   :smile:


-----------------------------------
Shell
Martes, 17 Enero 2017, 01:03

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
Vuott:

[quote]
Esta raya dice a Gambas: " Bueno, declaro una función externa que serà usada en el codigo con el nombre (fiticio) 'nombre_fiticio', y tiene un parametro de tipo Integer, y está en la libreria 'libc.so.6' y su real nombre es: exit  ".   
[/quote]

Vaya, es como un alias del comando.


-----------------------------------
vuott
Martes, 17 Enero 2017, 09:48

Re: De Nuevo Con Las Variables De Clase
-----------------------------------
[quote user="Shell" post="36720"]es como un alias del comando.[/quote]
Uhmmm... sì, exactamente. Bravo.


