Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación.

Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación.
Artículo
Citar    Descargar mensaje  
Mensaje Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación. 
 
El siguiente ejemplo muestra que escribiendo de mala manera en la memoria.......  

Public Sub Main()

 Dim s As String
 Dim i As Integer
 Dim p As Pointer
 Dim st As Stream
 Dim bb As New Byte[4]

' Por supuesto el resultado es  "3":'
   Print bb.Max
  
' Pero ahora....
   s = "aaaa"
   p = VarPtr(s)
  
   st = Memory p For Write
   Seek #st, 19
   Write #st, 68 As Byte    '  D
   Write #st, 105 As Byte   '  i
   Write #st, 109 As Byte   '  m
   st.Close
  
' La propiedad del array, que quedó nominalmente ".Max",
' ahora devuelve un numero diferente, es decir "1", aunque no aumentados sus elementos:
   Print bb.Max

End
    crazy



 
última edición por vuott el Lunes, 24 Octobre 2016, 12:47; editado 3 veces 
vuott - Perfil MP  
vuott [ Lunes, 24 Octobre 2016, 12:45 ]


Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación.
Comentarios
Citar    Descargar mensaje  
Mensaje Re: Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación. 
 
Vuott:

Estas poseido por el mal.... C y sus punteros !!!!      



 
jsbsan - Perfil MP  
jsbsan [ Lunes, 24 Octobre 2016, 13:05 ]
Citar    Descargar mensaje  
Mensaje Re: Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación. 
 
jsbsan escribió: [Ver mensaje]
Estas poseido por el mal.... C y sus punteros !!!!


Lo importante es no estar poseido por...... serpientesss !    



 
vuott - Perfil MP  
vuott [ Lunes, 24 Octobre 2016, 14:25 ]
Citar    Descargar mensaje  
Mensaje Re: Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación. 
 
No entendí porqué pasó eso.

Es porqué VarPtr no se debe usar con Strings y porqué st se definió antes de bb????

Saludos.



 
razaAztk - Perfil MP  
razaAztk [ Lunes, 24 Octobre 2016, 15:57 ]
Citar    Descargar mensaje  
Mensaje Re: Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación. 
 
razaAztk escribió: [Ver mensaje]
No entendí porqué pasó eso.


Todas las respuestas a los misterios del Universo Mundo están aquí:  
https://foro.gambas-es.org/viewtopic.php?f=1&t=5888



 
vuott - Perfil MP  
vuott [ Lunes, 24 Octobre 2016, 16:10 ]
Citar    Descargar mensaje  
Mensaje Re: Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación. 
 
Bueno, para los que no comprendieron, vamos a ver este otro codigo muy similar al anterior:

Public Sub Main()

Dim s As String
Dim i As Integer
Dim p As Pointer
Dim st As Stream
Dim bb As New Byte[4]

s = "aaaa"
p = VarPtr(s)

' Por supuesto el resultado es "3":'
Print bb.Max

Print

' Pero ahora....
st = Memory p For Write
Seek #st, 19
Write #st, 68 As Byte ' D
Write #st, 105 As Byte ' i
Write #st, 109 As Byte ' m
st.Close

Print

' La propiedad del array, que quedó nominalmente ".Max",
' ahora devuelve un numero diferente, es decir "1", aunque no aumentados sus elementos:
Print bb.Max

'...que es similar a lo que devuelve la propiedad ".Dim":
Print bb.Dim

End

En console podemos ver:

3    <------- Este numero es el resultado de bb.Max

0       61      a
1       61      a
2       61      a
3       61      a
4       00      ^@
5       53      S
6       74      t
7       72      r
8       65      e
9       61      a
10      6D      m
11      00      ^@
12      42      B
13      79      y
14      74      t
15      65      e
16      5B      [
17      5D      ]
18      00      ^@
19      4D      M      '   Antes de la modificación
20      61      a      '  Antes de la modificación
21      78      x      '  Antes de la modificación
22      00      ^@
23      43      C
24      6C      l
25      6F      o
26      73      s
27      65      e
28      00      ^@
29      40      @
30      69      i
31      6E      n
32      69      i
33      74      t
34      00      ^@
35      40      @
36      6E      n
37      65      e
38      77      w
39      00      ^@
40      73      s
41      00      ^@
42      69      i
43      00      ^@
44      70      p
45      00      ^@
46      73      s
47      74      t
48      00      ^@
49      62      b
50      62      b
51      00      ^@
52      00      ^@
53      00      ^@
54      00      ^@
55      00      ^@

0       61      a
1       61      a
2       61      a
3       61      a
4       00      ^@
5       53      S
6       74      t
7       72      r
8       65      e
9       61      a
10      6D      m
11      00      ^@
12      42      B
13      79      y
14      74      t
15      65      e
16      5B      [
17      5D      ]
18      00      ^@
19      44      D      '  es el resultado de:  Write #st, 68 As Byte
20      69      i      '  es el resultado de:  Write #st, 105 As Byte
21      6D      m      '  es el resultado de:  Write #st, 109 As Byte
22      00      ^@
23      43      C
24      6C      l
25      6F      o
26      73      s
27      65      e
28      00      ^@
29      40      @
30      69      i
31      6E      n
32      69      i
33      74      t
34      00      ^@
35      40      @
36      6E      n
37      65      e
38      77      w
39      00      ^@
40      73      s
41      00      ^@
42      69      i
43      00      ^@
44      70      p
45      00      ^@
46      73      s
47      74      t
48      00      ^@
49      62      b
50      62      b
51      00      ^@
52      00      ^@
53      00      ^@
54      00      ^@
55      00      ^@
1    <------- Este numero es el "nuevo" resultado de bb.Max
1    <------- Este numero es el resultado de bb.Dim

Usando un Puntero a una variable de tipo String (y solo con este tipo), es posible  penetrar en el área de memoria del Modulo y cambiar con Memory Stream la propiedad (o un Metodo) de un objeto) al mutar el nombre de una originaria propiedad (o de un originario Metodo).


Muy bien, ahora vamos a probar este otro codigo:
Public Sub Main()

Dim s As String
Dim i As Integer
Dim p As Pointer
Dim st As Stream
Dim bb As New Byte[4]

s = "aaaa"
p = VarPtr(s)

Print bb.Max

' Pero ahora....
st = Memory p For Write
Seek #st, 19
Write #st, 68 As Byte ' D
st.Close

Print

' Parece ser bb.Max......parece !   :-D
Print bb.Max

End

...que ocurre ?    



 
última edición por vuott el Martes, 25 Octobre 2016, 11:57; editado 2 veces 
vuott - Perfil MP  
vuott [ Martes, 25 Octobre 2016, 08:31 ]
Citar    Descargar mensaje  
Mensaje Re: Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación. 
 
Necesito un café...



 
shordi - Perfil MP  
shordi [ Martes, 25 Octobre 2016, 09:57 ]
Citar    Descargar mensaje  
Mensaje Re: Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación. 
 
Gracias por las explicaciones de punteros.

Pero, qué tipo de aplicaciones podría tener ete tipo de artilugio?

Saludos.



 
razaAztk - Perfil MP  
razaAztk [ Martes, 25 Octobre 2016, 16:16 ]
Citar    Descargar mensaje  
Mensaje Re: Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación. 
 
razaAztk escribió: [Ver mensaje]
... qué tipo de aplicaciones podría tener ete tipo de artilugio?

En gambas - habitualmente - las variables de tipo Punteros se usan especialmente (pero no solo) con las librerias externas escritas en C o C++. Eso, porqué - como sabes - el lenguaje C hace gran empleo de los Punteros .

Saludos



 
vuott - Perfil MP  
vuott [ Martes, 25 Octobre 2016, 17:18 ]
Citar    Descargar mensaje  
Mensaje Re: Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación. 
 
vuott escribió: [Ver mensaje]
razaAztk escribió: [Ver mensaje]
... qué tipo de aplicaciones podría tener ete tipo de artilugio?

En gambas - habitualmente - las variables de tipo Punteros se usan especialmente (pero no solo) con las librerias externas escritas en C o C++. Eso, porqué - como sabes - el lenguaje C hace gran empleo de los Punteros .

Saludos


Sé de la importancia de los punteros. Me refería a que tipo de aplicaciones tendría el uso del código de ejemplo que pusiste al principio del hilo.

Saludos.



 
razaAztk - Perfil MP  
razaAztk [ Martes, 25 Octobre 2016, 21:55 ]
Mostrar mensajes anteriores:    
Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente
 

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


 


   

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.3753s (PHP: -65% SQL: 165%)
Consultas SQL: 47 - Debug off - GZIP Activado