Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Construirse "artesanalmente" Un Array Parecido A Un Tipo String[ ]
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Error "Bad Character Constant In Stri... destroyer General 2 Domingo, 06 Marzo 2011, 09:15 Ver último mensaje
destroyer
No hay nuevos mensajes Un Detalle Con El Insert Into Gambas Value... jousseph Bases de Datos 5 Domingo, 04 Noviembre 2012, 20:58 Ver último mensaje
Shell
No hay nuevos mensajes Cuando, Al Regresar, A La Función Llamada... vuott General 4 Martes, 12 May 2015, 09:10 Ver último mensaje
vuott
No hay nuevos mensajes Public Const _Properties As String = "... v3ctor Controles/Librerías/Componentes 0 Martes, 27 Junio 2017, 23:37 Ver último mensaje
v3ctor
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron