Cuando escriba esta práctica haga uso de P5NCI
o de Inline
para la construcción de las funciones numéricas
con prototipos simples que aparezcan durante la construcción del módulo.
Basta con que considere la función del cálculo del máximo común divisor.
Si se siente realmente fuerte y capacitado puede leer
la sección como retornar múltiples valores del Inline::C Cookbok
para ver como implantar la suma y el producto de fracciones.
Este es un ejemplo de como hacerlo: Se deben empujar - usando Inline_Stack_Push - en la pila del intérprete Perl los valores de retorno:
void add_c(int n1, int d1, int n2, int d2) { n1 = n1*d2 + n2*d1; d1 = d1*d2; Inline_Stack_Vars; Inline_Stack_Reset; Inline_Stack_Push(sv_2mortal(newSViv(n1))); Inline_Stack_Push(sv_2mortal(newSViv(d1))); }La función Inline_Stack_Vars define un conjunto de variables internas que son necesarias para poder acceder a la pila del intérprete Perl.
En general, cuando la función sea de tipo void
como es el caso del ejemplo,
se deben usar las macros con nombre Inline_Stack_ . También si la función
tiene un número variable de argumentos (uso de la elípsis ...
).
Antes de comenzar a empujar items en la pila se debe llamar a la función Inline_Stack_Reset . Inicializa el puntero de pila interno al comienzo de la pila.
A partir del númerador n1 = n1*d2 + n2*d1
debemos construir
el escalar Perl que guarda el número. La función
newSViv es la que lo permite.
La notación newSViv
significa new Scalar
Value from an Integer Value.
El valor retornado por esta función es la estructura de datos que representa
un valor escalar Perl, conocido en la jerga como SV (véase perlguts).
Existe una familia de constructores de valores escalares
SV
a partir de diferentes tipos de fuentes:
newSVuv para enteros sin signo, newSVnv para doubles
,
etc. (véase perlapi).
Como sabemos el recolector de basura de Perl usa un contador de
referencias para saber que valores están en desuso y liberar la
memoria correspondiente.
La función sv_2mortal marca el SV
recién creado como mortal
para que su memoria pueda ser liberada por el sistema de gestión de memoria
cuando sea seguro hacerlo.
Casiano Rodríguez León