Construirse "artesanalmente" Un Array Parecido A Un Tipo String[ ]


Objetivo: Construirse "artesanalmente" Un Array Parecido A Un Tipo String[ ]
(Parto de esta pagina: https://foro.gambas-es.org/viewtopic.php?f=1&t=6877&start=12)

Este asunto no explicará cómo construir con el codigo "por sí solo", "artesanalmente" un array de tipo String[ ], ya que un Objeto, teniendo sus recursos (Propiedades, Métodos y Eventos), posee una organización interna muy compleja.
Este explicará cómo construir "artesanalmente" la sola parte del área de memoria, donde están guardados los datos del tipo que gambas llama "String", y la manera de usarla.

En general (tomemos como lenguaje de referencia el C) una variable, que se refiere a una "cadena", contiene una dirección (la prima celda) del área de memoria donde están guardados los datos. Cada valor que atañe a una dirección de memoria ocupa una cantidad de byte (celdas) de memoria
cantidad_ocupada = SizeOf(gb.Pointer)
Por lo tanto, un array de cadenas es claramente un área de memoria contenente una o más direcciones de memoria, que totalmente ocupa una cantidad de memoria:
cantidad_ocupada = SizeOf(gb.Pointer) * número_de_direcciones

Hagamos un ejemplo practico: vamos a construir un simple array de tipo String[ ] contenente 3 elementos.
El su área de memoria tendrà 3 valores, que ocupan SizeOf(gb.Pointer) * 3 y rapresentan las direcciones de memoria de cada cadena de caracteres, como sigue:

| d | i | r | e | cc | i | ó | n || d | i | r | e | cc | i | ó | n || d | i | r | e | cc | i | ó | n || = 24 byte/celdas ocupados

Vamos a construir en gambas este área de memoria:
Public Sub Main()

Dim arr As Pointer
Dim i As Integer
Dim s As String

' Tenemos que reservar una cantidad de memoria para los 3 valores que identifican las 3 direcciones de memoria de las 3 cadenas:
arr = Alloc(SizeOf(gb.Pointer), 3)

' Vamnos a ver el resultado:
For i = 0 To (SizeOf(gb.Pointer) * 3) - 1
If i Mod SizeOf(gb.Pointer) == 0 Then
s = "------------ Byte/celda donde iniciarà el valor de la dirección de memoria de la cadena\n"
Endif
Write i & " " & Hex(Byte@(arr + i), 2) & s
s = "\n"
Next

' Nunc memoriam liberat !
Free(arr)
' Además, para más garantías, podemos dirle tambien que la variable de tipo Puntero apunte a la celda num. 0 de la memoria:
arr = 0

End


Ahora podemos crear las tres cadenas de carácteres que tenemos, después, que guardar en el área de memoria de nuestro simple array.
Public Sub Main()

Dim arr, s0, s1, s2, pen As Pointer
Dim i As Integer
Dim s As String
Dim st As Stream

' Tenemos que reservar una cantidad de memoria para los 3 valores que identifican las 3 direcciones de memoria de las 3 cadenas:
arr = Alloc(SizeOf(gb.Pointer), 3)

' Aquí los tres cadenas de carácteres que tenemos que guardar en el área de memoria de nuestro simple array.
' Podríamos usar 3 variables de tipo "String", pero por motivos didácticos utilizaremos 3 variables de tipo "Pointer".
s0 = Alloc("Primera")
s1 = Alloc("Segunda")
s2 = Alloc("Tercera")

' Ahora vamos a escribir - con los recursos de "Memory Stream" - las 3 direcciones de memoria de los 3 Punteros en el área de memoria de nuestro simple array.
' Porque usamos "Memory Stream" ?
' Porque en gambas para escribir (si queremos guardar mediante recursos nativos de gambas) datos en un área de memoria,
' apuntado por un Puntero, solo podemos utilizar los recursos de "Memory Stream".
st = Memory arr For Write
Write #st, s0 As Pointer
Write #st, s1 As Pointer
Write #st, s2 As Pointer
st.Close

' Vamos a ver la disposición de los valores que atañan a las direcciones de memoria de los 3 Punteros en el área de memoria de nuestro array:
For i = 0 To (SizeOf(gb.Pointer) * 3) - 1
If i Mod SizeOf(gb.Pointer) == 0 Then
s = "------------ Inicio valor dirección de memoria de la cadena\n"
Endif
Write i & " " & Hex(Byte@(arr + i), 2) & s
s = "\n"
Next
Print

' Vamos a ver los resultados:
For i = 0 To 2
' Penetremos en el área de memoria de nuestro array deslizando por su byte (celdas):
pen = Pointer@(arr + (i * SizeOf(gb.Pointer)))
' Penetremos en el área de memoria de cada cadena de carácteres dereferenciando el Puntero:
Print "cadena #"; i, String@(pen)
Next

' Nunc memoriam liberat !
Free(s0)
Free(s1)
Free(s2)
Free(arr)
' Además, para más garantías, podemos dirle tambien que la variable de tipo Puntero apunte a la celda num. 0 de la memoria:
arr = 0

End

última edición por vuott el Jueves, 22 Marzo 2018, 02:42; editado 9 veces
Perfil MP  
Objetivo: Re: Construirse "artesanalmente" Un Array Parecido A Un Tipo String[ ]
muy bueno ayuda a entender como funciona un array internamente y también la difícil utilización de los punteros.

Objetivo: Re: Construirse "artesanalmente" Un Array Parecido A Un Tipo String[ ]
v3ctor escribió: [Ver mensaje]
...ayuda a entender como funciona un array internamente....

Debemos tener en cuenta, pero, que el área de memoria apuntada por la variable de tipo Puntero que yo llamé "arr" en mi codigo, sustancialmente corresponde al área de memoria apuntada por la Propiedad " .Data " del Objeto "Array" de Gambas.
Repito: la organización interna total del Objeto "Array" en gambas es mucho más compleja !

última edición por vuott el Jueves, 22 Marzo 2018, 02:38; editado 4 veces
Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1831s (PHP: -18% SQL: 118%)
Consultas SQL: 25 - Debug off - GZIP Activado