diff --git a/ediv/doc/html/varindex-howto.dok b/ediv/doc/html/varindex-howto.dok new file mode 100644 index 0000000..ec61286 --- /dev/null +++ b/ediv/doc/html/varindex-howto.dok @@ -0,0 +1,92 @@ +<%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.