https://foro.gambas-es.org/viewtopic.php?f=1&t=2564
-----------------------------------
Alaplancha
Miercoles, 29 Agosto 2012, 20:03

AS Y AS NEW
-----------------------------------
Hola amigos. Soy nuevo en este sitio. Quisiera hacer una pregunta. Estoy intentando comprender los tipos de matrices que se pueden declarar y cómo acceder a ellas con punteros. Pero hay veces que no entiendo cuándo podemos/debemos poner en la declaración AS o AS NEW. En los siguientes ejemplos he declarado previamente una clase llamada Miclase:

PRIVATE matriz_1[4, 12] AS Integer
PRIVATE puntero_2 AS Integer[]
PRIVATE puntero_3 AS NEW Integer[]
PRIVATE matrizdepunteros_4[6, 9] AS Integer[]
PRIVATE puntero_5 AS Miclase
PRIVATE puntero_6 AS NEW Miclase
PRIVATE matrizdepunteros_7[4, 6] AS Miclase
PRIVATE puntero_8 AS Miclase[]
PRIVATE puntero_9 AS NEW Miclase[]
PRIVATE matrizdepunteros_10[2, 8] AS Miclase[]
PRIVATE puntero_11 AS NEW Integer[4, 7] 
PRIVATE puntero_12 AS NEW Float[][4, 7]
PRIVATE puntero_13 AS NEW Miclase[4, 7]
PRIVATE puntero_14 AS NEW Miclase[][4, 7]

Cocretamente no entiendo por qué en los últimos cuatro casos no deja poner un simple AS.


-----------------------------------
Shell
Jueves, 30 Agosto 2012, 00:03

Re: AS Y AS NEW
-----------------------------------
Hola Alaplancha. :roll:

Las ultimas cuatro instrucciones no estas escritas bien.

En Gambas existen dos tipos de arrays.Los de una dimensión son declarados con AS NEW
Son dinámicos.Crecen o encogen su numero a medida que añades o eliminas elementos.
Al usar la palabra NEW estas iniciializando el array.

[code linenumbers=false syntax=gambas]
Private Nombres AS NEW STRING[]
[/code]

[code linenumbers=false syntax=gambas]
PRIVATE Nombres AS STRING[]

Nombres=NEW STRING[]
[/code]
Hace lo mismo.En el primer ejemplo es mas abreviado.

Luego existen los arrays nativos.Que pueden tener hasta 8 dimensiones.
No son dinámicos.No se les puede cambiar el tamaño una vez declarada sus
dimensiones.

[code linenumbers=false syntax=gambas]
Private Nombres[4,4] AS STRING
[/code]

Necesitas el manual de Gambas y usa el buscador para el tema de punteros.
No lo hemos tratado mucho.Pero hay algo de información.

Aquí tienes el enlace:

http://foro.gambas-es.org/viewtopic.php?f=1&t=426&highlight=punteros

Saludos.


-----------------------------------
Alaplancha
Jueves, 30 Agosto 2012, 07:37

Re: AS Y AS NEW
-----------------------------------
Hola Shell.

Muchas gracias por tu respuesta. Tengo que estudiar más, ya que soy consciente de que estoy muy pez.

Creo que lo primero que he de hacer es nombrar las cosas como Identificador en lugar de como puntero. Copio aquí un código que he hecho con los ejemplos 11 y 13. Funcionan los dos, a condición de utlizar AS NEW y no un simple AS. Es decir, que tengo que declarar el Identificador e ¿instanciar? en una misma línea, no me deja postponer el NEW para una segunda línea má tarde, y eso no lo entiendo:

Primero creo una clase llamada Miclase:

' Gambas class file
Public x As Float
Public y As Float

Después en FMain escribo:

' Gambas class file
Private Identif_11 As New Integer[4, 7] 'Declara e instancia una matriz 4x7 para guardar enteros
Private Identif_13 As New Miclase[4, 7] 'Declara e instancia una matriz 4x7 para guardar objetos de la clase Miclase
Private Objeto As New Miclase

Y dentro de Form_Open() escribo:

Identif_11[2, 3] = 18
Print Identif_11[2, 3]

Objeto.x = 3.141592
Identif_13[3, 5] = Objeto
Print Identif_13[3, 5].x

Esto funciona. En consola obtengo 18 y 3.141592.

Saludos.


-----------------------------------
Shell
Jueves, 30 Agosto 2012, 08:45

Re: AS Y AS NEW
-----------------------------------
Hola Alaplancha.

[quote user="Alaplancha" post="14610"]
Muchas gracias por tu respuesta. Tengo que estudiar más, ya que soy consciente de que estoy muy pez.
[/quote]
Ademas de Gambas también es bueno que vayas aprendiendo a usar la interfaz de la comunidad.Date tiempo, ve probando cosas. :-)
Para que el código en el mensaje se vea mejor. Hacemos click una vez para abrir y otra para cerrar las etiquetas que encierran el código.
Al igual que las etiquetas de las paginas html.

 [img]http://foro.gambas-es.org/files/images/768/menuobjetos.png[/img] 

Te muestro como quedaría el código.

[quote user="Alaplancha" post="14610"]

Creo que lo primero que he de hacer es nombrar las cosas como Identificador en lugar de como puntero. Copio aquí un código que he hecho con los ejemplos 11 y 13. Funcionan los dos, a condición de utlizar AS NEW y no un simple AS. Es decir, que tengo que declarar el Identificador e ¿instanciar? en una misma línea, no me deja postponer el NEW para una segunda línea má tarde, y eso no lo entiendo:

[/quote]

Esa es la palabra.Instanciar.Si, si puedes hacerlo en otra linea.
Creas la clase, defines el objeto como el tipo de esa clase y luego
en una parte del código si la variable es común a todo el código, añades
NEW para instanciar el objeto.

Imagina que has creado la clase ejemplo y luego en el formulario FMain la defines y la instancias.

[code linenumbers=false syntax=gambas]
' Gambas class file
PRIVATE objeto AS ejemplo

PUBLIC SUB Form_Open()

objeto=NEW ejemplo

END
[/code]
Podía haberla instanciado en otro lugar de FMain si la variable es común a todo el formulario.

[quote user="Alaplancha" post="14610"]
Primero creo una clase llamada Miclase:

[code linenumbers=false syntax=gambas]
' Gambas class file
Public x As Float
Public y As Float
[/code]
Después en FMain escribo:
[code linenumbers=false syntax=gambas]
' Gambas class file
Private Identif_11 As New Integer[4, 7] 'Declara e instancia una matriz 4x7 para guardar enteros
Private Identif_13 As New Miclase[4, 7] 'Declara e instancia una matriz 4x7 para guardar objetos de la clase Miclase
Private Objeto As New Miclase
[/code]
Y dentro de Form_Open() escribo:
[code linenumbers=false syntax=gambas]
Identif_11[2, 3] = 18
Print Identif_11[2, 3]

Objeto.x = 3.141592
Identif_13[3, 5] = Objeto
Print Identif_13[3, 5].x
[/code]
Esto funciona. En consola obtengo 18 y 3.141592.
[/quote]

Es bueno también que los identificadores los nombres con nombres mas simples, mas comunes.
Si ya conocías el tema de punteros no debes ser muy nuevo en el tema de la programación.

Saludos.


-----------------------------------
Alaplancha
Domingo, 02 Septiembre 2012, 10:55

Re: AS Y AS NEW
-----------------------------------
Hola Shell,

gracias por tu ayuda. Lo cierto es que soy autodidacta como programador, y mi base no es sólida, ni con los punteros ni con otras cosas. Poco a poco iré mejorando.

He estado estos días leyendo libros y buscando por aquí y por allá, y me voy haciendo una idea más precisa de cómo utilizar las matrices. Una dificultad añadida es que las versiones de Gambas se van actualizando, y sus características cambian, con lo cual un hilo muy antiguo de un foro o una documentación no actualizada pueden despistar.

En el siguiente hilo

[url=http://www.mail-archive.com/gambas-user@lists.sourceforge.net/msg11090.html]Benoît Minisini - About arrays

Benoît nos explica los dos tipos de matrices: normal y embedded. A las matrices normales también a veces vamos a encontrar que las llaman dinámicas o de tipo Java. A las matrices embedded también a veces vamos a encontar que las llaman estáticas o nativas. Benoît Prefiere llamarlas embedded (¿incrustadas?) porque estáticas puede inducir a confusión con la palabra STATIC, con la que no tienen nada que ver. Dice también que las matrices normales son auténticos objetos, tienen su propia dirección de memoria, mientras que las embedded están alojadas dentro de otro objeto. 

Para diferenciar estos dos tipos de matrices cuando leemos las líneas de código, las matrices embedded tienen los corchetes donde especificar las dimensiones detrás del Identificador, mientras que las matrices normales los tienen detrás del Tipo.

En el siguiente hilo

[url=http://old.nabble.com/Gambas-3-arrays-usage-td33803439.html#a33803439]Emil Lenngren - Gambas 3 arrays usage

Emil Lenngren y otros nos explican que las matrices embedded sólo pueden ser globales (ya sea públcas o privadas) y han de ser declaradas por ejemplo así:

[code linenumbers=false syntax=gambas]
Public ArrayOfStrings[5] As String  ' Una matriz embedded pública
[/code]

Mientras que las matrices normales pueden ser globales (ya sea públicas o privadas) o locales, y han de ser declaradas por ejemplo así:

[code linenumbers=false syntax=gambas]
Dim ArrayOfStrings As New String[5] ' Una matriz normal local
Public ArrayOfStrings As New String[5]  ' Una matriz normal global pública
[/code]

Observamos que para las matrices normales, [u]ahora es obligatorio declarar con [b]AS NEW[/b][/u] (lo cual creo que respondería al título de mi mensaje) como nos indica Benoît en este otro hilo:

[url=http://www.mail-archive.com/gambas-user@lists.sourceforge.net/msg09386.html]Benoît - Support for "static" arrays has been removed

En ese hilo habla de que el soporte (support) para las matrices embedded ha sido definitivamente suprimido. No sé exactamente que quiere decir que no hay soporte, si es que se pueden seguir utilizando,... El caso es que durante mucho tiempo recomendaron no utilizar las matrices embedded.

Dentro de las matrices normales, parece ser que la única opción no es matrices "dinámicas" de las que crecen, tipo Java, sino que podemos declarar también matrices con dimensiones conocidas en tiempo de compilación, por ejemplo:

[code linenumbers=false syntax=gambas]
Private matriz As New Integer[1, 2, 3, 4, 5, 6, 7, 8] ' Una matriz normal global privada, de hasta ocho dimensiones máximo, de tipo Integer
Private matriz As New Integer[][6, 19] ' Una matriz normal global privada, de tipo Integer[]
Private matriz As New Miclase[42, 3] ' Una matriz normal global privada, de tipo Miclase
Private matriz As New Miclase[][5, 7] ' Una matriz normal global privada, de tipo Miclase[]
[/code]

Saludos


