Reescriba en C las Funciones de Cálculo

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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19