Anuncios

Bienvenidos sean a este post, hoy veremos como una clase de almacenamiento nos ayuda con las funciones.

Anuncios

Nosotros ya hablamos sobre static en las variables en este post y en este post mencionamos como trabaja siendo una clase de almacenamiento, pero si lo usamos con funciones o prototipos este toma un proposito diferente pero de eso ya hablaremos, por otro lado si en el prototipo usamos a static despues al momento de definirlo tambien deberemos usarlo, vamos a tomar uno de los codigos del post anterior y vamos a modificarlo, por ejemplo si tomamos el archivo funciones.c y declaramos a los prototipos como static seria de la siguiente manera:

#include "funciones.h"

static ListaNombres* CreaListaNombres();
static ListaNodo* CrearListaNodo(char* aNombreAgregar);
static void MasAllaAlmacenamiento();
static bool EstaVacio(ListaNombres* aNombres);

... resto del codigo
Anuncios
Anuncios

Simplemente lo aplicamos antes del tipo, pero esto que hara? le dira al compilador que la funcion no debe ser exportada al enlazador (linker), esto evitara que la funcion sea llamado desde cualquier otro archivo y solamente puede ser llamada desde el archivo donde se definio, esto nos puede ser especialmente util cuando tenemos multiples codigos fuente y puede existir conflictos con los nombres, donde podemos tener mismos nombres pero distintas operaciones y gracias a esto lo delimitaremos a sus respectivos archivos, para entenderlo mejor vamos a crear un ejemplo y para ello crearemos un nuevo directorio con el nombre de circulo y dentro crearemos los archivos del programa, nuestro primer archivo llevara el nombre de trig.h y le agregaremos el siguiente codigo:

trig.h

#include <stdio.h>

double circulo_circunferencia(double diametro);
double circulo_area(double radio);
double circulo_volumen(double radio);
extern const double global_pi;
Anuncios

En este archivo simplemente definiremos los prototipos de las funciones que usaremos en todo el programa y una constante con el extern para que sea accedida desde todo el programa, nuestro siguiente paso sera crear un nuevo archivo con el nombre de trig.c y le agregaremos el siguiente codigo:

trig.c

#include "trig.h"

static double cuadrado(double d);
static double cubo(double d);

const double global_pi = 3.14159265358979323846;

double circulo_circunferencia(double diametro)
{
	double resultado = diametro * global_pi;
	return resultado;
}

double circulo_volumen(double radio)
{
	double resultado = 4.0/3.0 * global_pi * cubo(radio);
	return resultado;
}

double circulo_area(double radio)
{
	double resultado = global_pi * cuadrado(radio);
	return resultado;
}

static double cuadrado(double d)
{
	return d * d;
}

static double cubo(double d)
{
	return d * d * d;
}
Anuncios
Anuncios

Este sera el achivo donde definiremos los prototipos del archivo anterior y algunos otros mas, primero incluimos el archivo anterior, luego declaramos dos prototipos de funciones, uno para calcular el cuadrado y la otro para calcular el cubo del valor informado en cada uno y ambos seran estaticos para que trabajen solamente en este archivo y ninguna otra parte del programa, despues tenemos la definicion de la constante que hicimos externa en el archivo anterior, pasemos a hablar sobre la primera funcion, esta nos permite obtener la circunferencia de un circulo en base al diametro que le pasemos como argumento y devolvera el resultado, la siguiente funcion es para calcular el volumen de un circulo pero esta vez le pasaremos el radio en lugar del diametro y al igual que el anterior devolveremos el resultado de la operacion, la tercera funcion es para calcular el area de un circulo, tambien recibe el radio de este y por ultimo devolvemos el resultado de la operacion, con esto ya definimos los tres prototipos del archivo anterior, ahora solo nos restan dos definiciones, en este caso seran las dos funciones estaticas del inicio, observen que simplemnte multiplicamos el valor recibido la cantidad de veces necesarias, esto es simplemente para usarlas en las formulas anteriores.

Anuncios

Ahora solo nos resta un paso mas y para eso crearemos un nuevo archivo al cual llamaremos circulo.c y le agregaremos el siguiente codigo:

circulo.c

#include <stdio.h>
#include "trig.h"

static const double radio_circulo_unidad = 1.0;

void circulo(double radio);

int main()
{
	circulo(-1.0);
	circulo(2.5);
}

void circulo(double radio)
{
	double r = 0.0;
	double d = 0.0;

	if (radio <= 0.0) 
		r = radio_circulo_unidad;
	else
		r = radio;

	d = 2 * r;

	if (radio <= 0) 
		printf("Circulo de Unidad:\n");
	else
		printf("Circulo\n");

	printf("radio = %10.4f cm\n", r);
	printf("circunferencia = %10.4f cm\n", circulo_circunferencia(d));
	printf("area = %10.4f cm cuadradas\n", circulo_area(r));
	printf("volumen = %10.4f cm cubicos\n", circulo_volumen(r));
}
Anuncios
Anuncios

Este sera el codigo del programa en si, primero incluiremos el archivo de encabezado que desarrollamos antes, lo siguiente sera definir una constante de tipo static la cual usaremos despues, lo siguiente sera declarar un prototipo de una funcion llamada circulo, en el main solo llamaremos dos veces a esa funcion con dos valores distintos, y lo ultimo sera definir el prototipo, observen que recibimos un valor, en ella definiremos dos valores para el radio y el diametro que usaremos internamente, despues de esto tenemos un condicional donde verificamos si el valor pasado como argumento es menor o igual a cero, en caso de ser verdadero asignaremos el valor de la constante definida al comienzo a la variable r, de lo contrario le asignaremos el valor informado a la variable antes citada, nuestro siguiente paso sera establecer el valor de d y para ello multiplicaremos por dos el valor de r lo que equivale al diametro, esto que sigue es un condicional que muestra un mensaje dependiendo del valor pasado como argumento, por ultimo mostraremos varios datos:

  • La primera linea muestra solo el valor de la radio
  • La siguiente sera para mostrar el valor de la circunferencia obtenido por la funcion
  • La tercer linea mostrara el area por medio de la funcion
  • La ultima sera el volumen tambien por la funcion con ese fin
Anuncios

Antes de probarlo veamos que en el momento de usar a main pasamos un valor negativo para chequear todas las opciones posibles, con todo esto comentado compilemos y ejecutemos el programa para ver como es su salida:

atinchicus@dbn001vrt:~/lenguajes/C/circulo$ gcc *.c -o circulo
tinchicus@dbn001vrt:~/lenguajes/C/circulo$ ./circulo 
Circulo de Unidad:
radio =     1.0000 cm
circunferencia =     6.2832 cm
area =     3.1416 cm cuadradas
volumen =     4.1888 cm cubicos
Circulo
radio =     2.5000 cm
circunferencia =    15.7080 cm
area =    19.6350 cm cuadradas
volumen =    65.4498 cm cubicos
tinchicus@dbn001vrt:~/lenguajes/C/circulo$
Anuncios

Observen como deben compilarlo para que tome todos los archivos necesarios, los cuales basicamente son trig.c y circulo.c, despues cuando lo ejecutamos podemos ver como son las devoluciones de los llamados a la funcion circulo, vamos a suponer un ejemplo para ver como se limita el llamado a las funciones, para ello vamos a agregar la siguiente linea en el main:

printf("%d", cubo(3.0));
Anuncios

Si lo compilamos nos devolvera el siguiente error:

tinchicus@dbn001vrt:~/lenguajes/C/circulo$ gcc *.c -o circulo
circulo.c: In function ‘main’:
circulo.c:10:15: warning: implicit declaration of function ‘cubo’ [-Wimplicit-function-declaration]
   10 |  printf("%d", cubo(3.0));
      |               ^~~~
/usr/bin/ld: /tmp/ccGIoNi1.o: en la función `main':
circulo.c:(.text+0x16): referencia a `cubo' sin definir
collect2: error: ld returned 1 exit status
tinchicus@dbn001vrt:~/lenguajes/C/circulo$
Anuncios

Nos devuelve ese error porque no puede llegar al mismo, ahora si lo declaran en el archivo de encabezado y le sacan el static podremos utilizarla como las otras funciones que si utilizamos.

Anuncios

En resumen, hoy hemos visto static y funciones, como se utiliza, para que se utiliza, como se comporta, y un ejemplo practico para ver como trabaja, espero les haya sido de utilidad 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
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50