Anuncios

Bienvenidos sean a este post, mas alla de lo que hemos visto en los anteriores posts los cuales intercambian valores entre C y la pila la API ofrece tambien los siguientes operadores para la manipulacion generica de la pila:

int	lua_gettop	(lua_State *L);
void	lua_settop	(lua_State *L, int indice);
void	lua_pushvalue	(lua_State *L, int indice);
void	lua_remove	(lua_State *L, int indice);
void	lua_insert	(lua_State *L, int indice);
void	lua_replace	(lua_State *L, int indice);
Anuncios

La funcion lua_gettop devuelve el numero de elementos de la pila el cual es tambien el indice del elemento de la parte superior de la pila, lua_settop setea el limite de superior de la pila, el numero de elementos de la pila, para un valor especifico y si el limite superior anterior era mas alto que el nuevo todos los valores de la parte superior son descartados, de lo contrario la funcion empuja nil en la pila hasta obtener el tamaño informado, un caso particular es utilizar lua_settop(L, 0) la cual vacia la pila, tambien podemos usar indices negativos con lua_settop, para el uso de esta facilidad la API ofrece la siguiente macro la cual quita un elemento de la pila:

#define lua_pop(L, n)	lua_settop(L, -(n) - 1)
Anuncios

La funcion lua_pushvalue empuja en la pila una copia del elemento en el indice informado, lua_remove quita el elemento en el indice informado, moviendo hacia abajo todos los elementos en la parte superior de esta posicion para llenar el vacio, lua_insert mueve el elemento de la parte superior dentro de la posicion informada y por ultimo lua_replace quita un valor de la parte superior y lo setea como el valor del indice informado sin mover nada, las siguientes operaciones no tienen efecto sobre la pila:

lua_settop(L, -1) /* setea la parte superior a su valor actual */
lua_insert(L, -1) /* mueve el elemento de la parte superior a la parte superior */
Anuncios

El siguiente codigo usa la funcion pilaVolcado que vimos en el post anterior:

#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"

static void pilaVolcado(lua_State *L)
{
	int i;
	int arriba = lua_gettop(L);
	for (i = 1; i <= arriba; i++)
	{
		int t = lua_type(L, i);
		switch(t)
		{
			case LUA_TOSTRING:
			{
			printf("'%s'", lua_tostring(L, i));
			break;
			}
			case LUA_TBOOLEAN:
			{
			printf(lua_toboolena(L, i) ? "true" : "false");
			break;
			}
			case LUA_TNUMBER:
			{
			printf("%g", lua_tonumer(L, i);
			break;
			}
			default:
			printf("%s", lua_typename(L, i));
			break;
			}
		}
		printf("   ");
	}
	printf("\n");
}

int main (void)
{
	lua_State *L = luaL_newstate();

	lua_pushboolean(L, 1);
	lua_pushnumber(L, 10);
	lua_pushnil(L);
	lua_pushstring(L, "hola");
	
	pilaVolcado(L);
	
	lua_pushvalue(L, -4);
	pilaVolcado(L);
	
	lua_replace(L, 3);
	pilaVolcado(L);

	lua_settop(L, 6);
	pilaVolcado(L);

	lua_remove(L, -3);
	pilaVolcado(L);

	lua_settop(L, -5);
	pilaVolcado(L);

	lua_close(L);
	return 0;
}
Anuncios

En este caso primero setearemos todas las librerias que necesitemos, despues usaremos la funcion que vimos en el post anterior y nuestro siguiente paso es ver el main, para ello crearemos una pila llamada L, a esta pila primero agregaremos un booleano (true), un numero (10), un valor nil y un valor de cadena (hola), nuestro siguiente paso sera mostrar la pila donde veremos un resultado como este:

true	10	nil	hola
Anuncios

Nuestro siguiente paso sera agregar a la parte superior el valor de la posicion -4 (es decir el cuarto contando desde la parte superior a la inferior) donde obtendremos este resultado al hacer el volcado de nuestro pila:

true	10	nil	hola	true
Anuncios

Para el siguiente usaremos a lua_replace para reemplazar al indice informado con el de la parte superior, si lo ejecutamos y hacemos el volcado de memoria veremos esto:

true	10	true	hola
Anuncios

En este caso se quito el valor de la parte superior y lo uso en el tercer indice haciendo desaparecer a nil, para nuestro siguiente paso cambiaremos la parte superior de nuestra pila, una vez ejecutado y hacer el volcado de la pila veremos lo siguiente:

true	10	true	hola	nil	nil
Anuncios

Como no tenemos valores hasta la nueva parte superior la funcion lo completo con nil automaticamente, para nuestro siguiente paso usaremos a lua_remove para quita el tercer elemento desde la parte superior, una vez hecho y si mostramos el volcado de la pila veremos la siguiente salida:

true	10	true	nil	nil
Anuncios

En este caso vemos que se quito al valor de ‘hola’ y corriendo los valores anteriores para completar el vacio que se genero, por ultimo probamos de volver a setear la parte superior a un solo elemento, si hacemos el volcado de la pila quedara asi:

true
Anuncios

Como pueden ver quedo solamente el primer valor, si volvieramos a setear la parte superior con un valor superior se llenara de nil porque los valores anteriores han sido removidos de la pila, por ultimo usamos a lua_close(L) para liberar la pila, y devolvemos cero para mostrar que se salio correctamente.

Anuncios

En resumen, hoy hemos visto otras operaciones de la pila, como podemos manipular a la misma, un pequeño ejemplo, y los resultados de las distintas modificaciones de nuestra pila, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00