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


Ir a la página 1, 2  Siguiente

Objetivo: 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
Perfil MP  
Objetivo: 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 !!!!

Objetivo: 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 !

Perfil MP  
Objetivo: 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.

Objetivo: 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

Perfil MP  
Objetivo: 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
Perfil MP  
Objetivo: Re: Alterar Una Propiedad O Un Método De Un Objeto Modificando La Denominación.
Necesito un café...

Perfil MP  
Objetivo: 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.

Objetivo: 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

Perfil MP  
Objetivo: 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.

Ir a la página 1, 2  Siguiente

Página 1 de 2


  
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.1168s (PHP: -9% SQL: 109%)
Consultas SQL: 24 - Debug off - GZIP Activado