Jugamos Con Memoria Reservada, Punteros Y Memory Stream


Objetivo: Jugamos Con Memoria Reservada, Punteros Y Memory Stream
Os presento un simple código con objetivo meramente didáctico, que quiere enseñar como debe ser programado un hipotético código gambas en caso de asignación de un área de memoria, apuntado por una variable de tipo Puntero, en el que escribir con los Memory Stream uno o más datos.

El proyecto muestra:

* dos TableView, que representan el área de memoria reservada en el que insertar a uno más valores (tipo Byte) y el número de índice de cada celda de la memoria reservada. Cada celda del TableView representa una celda de la memoria reservada. Arriba es indicado, como ya dije, el número de índice por cada celda de memoria.
* un TextArea que muestra el consiguiente código que debería ser escrito para conseguir la cantidad elegida de memoria reservada y los valores que se quiere escribir.

Al inicio será solicitada la cantidad de memoria, de 1 a 16, que debe ser reservada.
Para insertar los valores de tipo Byte, hará falta hacer clic en una celda, escribir por lo tanto el valor de tipo Byte, de 0 a255, y en fin presioar la tecla "Enter" del teclado.
Es posible escribir de nuevo un valor en una celda, que ya haya sido valorizada.

Private tv As TableView
Private ta As TextArea
Private chd As String
Private primus As Boolean
Private inx As Short = -1


Public Sub Form_Open()

Dim b As Byte
Dim index As TableView

Do
b = Val(InputBox("Elige la cantidad de memoria que debe ser reservada<BR>(min 1, max 16):", Null, "8"))
Loop Until (b > 0) And (b < 17)

With index = New TableView(Me)
.X = 20
.Y = 40
.W = 500
.H = 20
.Rows.Count = 1
.Rows.Height = index.H
.Columns.Count = b
.ScrollBar = 0
End With
For b = 0 To index.Columns.Count - 1
With index
.Columns.W = .W \ .Columns.Count
.Columns[b].Alignment = Align.Center
index[0, b].Text = CStr(b)
End With
Next

With tv = New TableView(Me) As "TableView"
.X = 20
.Y = index.Y + index.H + 5
.W = 500
.H = 50
.Rows.Count = 1
.Rows.Height = tv.H
.Columns.Count = b
.ScrollBar = 0
End With

For b = 0 To tv.Columns.Count - 1
With tv
.Columns.W = .W \ .Columns.Count
.Columns[b].Alignment = Align.Center
tv[0, b].Text = "0"
End With
Next

ImpostaTextArea(b)

primus = True

End


Public Sub TableView_Click()

tv.Edit

End


Public Sub TableView_Save(riga As Integer, col As Integer, valore As String)

Dim sk As String

If (valore = Null) Or (Len(valore) > 3) Or (Val(valore) > 255) Then Return
If tv[0, tv.Column].Text = valore Then Return
If tv.Columns.Count > 1 Then
If (col > 0) And (tv.Column <> inx + 1) Then sk = "\n\n Seek #st, " & CStr(col)
If (col = 0) And (primus = False) Then sk = "\n\n Seek #st, " & CStr(col)
Endif

tv[riga, col].Text = valore

With ta
.Text = Left(.Text, Len(.Text) - (Len(chd)))
.Text &= sk & "\n Write #st, " & valore & " As Byte" & chd
End With

sk = Null

primus = False
inx = tv.Column

End


Private Procedure ImpostaTextArea(n As Byte)

chd = "\n\n st.Close\n\n ......\n ......\n\n Free(p)"

With ta = New TextArea(Me)
.X = 20
.Y = tv.Y + tv.H + 40
.W = tv.W
.H = 300
.Text = "Dim p As Pointer\nDim st As Stream\n\n" &
" p = Alloc(SizeOf(gb.byte), " & CStr(n) & ")\n\n" &
" st = Memory p For Write" & chd
End With

End

última edición por vuott el Martes, 06 Diciembre 2016, 10:37; editado 4 veces
Perfil MP  
Objetivo: Re: Jugamos Con Memoria Reservada, Punteros Y Memory Stream
Malvados punteros..

Esto tengo que leerlo con tranquilidad.

Saludos

Objetivo: Re: Jugamos Con Memoria Reservada, Punteros Y Memory Stream
Shell escribió: [Ver mensaje]
Malvados punteros..


La variable de tipo Puntero se comporta como el Puntero interno del objeto File.

Un Puntero simplemente "apunta" a la primera celda de memoria de un area reservada.

Vamos a hacer una comparación.

Si tu tienes por ejemplo la palabra "Shell", y yo te pido que leas esta palabra, tu comienzas por supuesto desde la primera letra de la palabra, es decir "S".

Bueno, el Puntero apunta a la primera celda del area de memoria como los tus ojos que apuntan a la primera letra de la palabra.

Cuando usamos la función "Seek" - por ejemplo: "Seek #st, 2", es como si yo te digo: " Empieza leyendo desde la tercera letra de la palabra."

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
No 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.1563s (PHP: 47% SQL: 53%)
Consultas SQL: 20 - Debug off - GZIP Activado