%title%>Uso del indexado dinámico de variables desde el stub y las librerías<%/title%>
Mediante el indexado dinámico podemos acceder a cualquier variable,
tabla o estructura situada en cualquier librería. Para este fin existe
una función, GetVarOffset, que devuelve el offset en mem[]
de cualquier variable indicando su tipo (global, reserved, local) y su nombre
como cadena de caracteres. Sin embargo, para simplificar la tarea, existen unas
macros cuyo uso voy a explicar aquí.
Mediante estas macros podemos acceder a las variables de DIV como si de variables del lenguaje C se trataran. Podemos usarlas en expresiones, asignarles valores y obtener su offset con el operador &.
Accede directamente a la variable global indicada.
Ejemplo:
<%code%>if ( global("dump_type") == 0 ) ...<%/code%>Accede directamente a la variable de la estructura reserved
del
proceso indicado.
Ejemplo:
<%code%>reserved("frame_percent",id) += mem[imem++];<%/code%>Accede directamente a la variable local del proceso indicado.
Ejemplo:
<%code%>if ( local("graph",id) != 0 ) ...<%/code%>mem[]
El objetivo de estas macros es obtener el offset relativo a mem[]
de la variable deseada. Generalmente no será necesario usarlas, excepto
para acceder a tablas y estructuras.
Obtiene el offset en mem[]
de la variable global indicada.
Ejemplo:
<%code%>mem[globalptr("fps")] = my_fps;<%/code%>Obtiene el offset en mem[]
relativo a proceso (sin sumar
el id) de la variable indicada de la estructura reserved
.
Ejemplo:
<%code%>mem[reservedptr("status") + id] = 4;<%/code%>Obtiene el offset en mem[]
relativo a proceso (sin sumar
el id) de la variable local.
Ejemplo:
<%code%>mem[localptr("size") + id] = 100;<%/code%>Es muy sencillo: con globalptr
o localptr
obtenemos
el offset del comienzo de la tabla. Luego basta sumar a ese offset el número
de posición de la tabla que queremos leer o escribir.
Ejemplo: Para poner timer[4]
a cero:
Aquí la cosa es parecida. Empecemos con una estructura de 1 sólo
registro, por ejemplo mouse
. Supongamos que queremos acceder
a su miembro left
. Con globalptr
obtenemos el
offset del inicio de la estructura. Después debemos sumarle la posición
en la que se encuentra el miembro dentro de la estructura, empezando a contar
por 0 (o, dicho de otro modo, el número de miembros que preceden
a la estructura). En este caso, a left
le corresponde el número
9. Así, para poner mouse.left
a 1:
¡OJO! Hemos dado por supuesto que todos los miembros
son int
. Si la estructura contiene alguna tabla, debemos sumar
el tamaño de la tabla en int's. Si contiene una string
,
debemos sumar su tamaño en int's, que se calcula así:
1+(tamaño+5)/4.
En el caso de que la estructura tenga varios registros, hay que sumar al
offset, además de la posición del miembro en cuestión,
el tamaño de la estructura multiplicado por el número del
registro. Por ejemplo, para acceder a scroll[3].z
:
El 4 es la posición de z
en la estructura, y el 10
el tamaño de la estructura scroll
.
Naturalmente, si queremos acceder a una estructura local, en el caso de
que la haya (no hace falta usar este método para acceder a variables
de reserved
ya que para eso está la macro reserved
explicada más arriba), también habrá que sumar al offset
el id del proceso.