Anuncios

Bienvenidos sean a este post, hoy veremos al tipo estatico.

Anuncios
Anuncios

Si bien en el post anterior vimos como es el ciclo de vida de una variable pero en algunas ocasiones necesitamos que un dato se mantenga mas alla del ciclo de vida de una variable automatica interna,un ejemplo de la vida real puede ser una funcion que puede ser llamada desde cualquier parte y siempre debe devolver un valor que se incrementara con cada llamada como puede ser un contador de visitas en una pagina, como esto no puede ser realizada de manera sencilla con todo lo visto anteriormente, enta en escena la clase de almacenamiento estatica la cual en conjunto con auto nos permite tenerlas tanto en almacenamientos internos como externos.

Anuncios
Anuncios

Por ejemplo si nosotros dentro del bloque de una funcion definismos una variable con la palabra static, esta solamente podra ser accedida si llamamos a la funcion, siendo que el valor inicial de la variable estatica al momento de la compilacion y no es re-evaluado al momento de ejecucion, por lo tanto el valor asignado a esta variable debe ser conocido al momento de compilacion y no puede ser una expresion o variable, para entenderlo vamos a hacer un nuevo ejemplo, para ello crearemos un archivo con el nombre de ejemplo26.c y le agregaremos el siguiente codigo:

ejemplo26.c

#include <stdio.h>

int incrementar()
{
	static int valor = 0;
	valor++;
	return valor;
}

int main()
{
	for(int i=0; i < 5; i++)
	{
		printf("%d\n", incrementar());
	}
	return 0;
}
Anuncios

Este es un ejemplo simple donde primero tenemos una funcion llamada incrementar y dentro tendremos una variable llamada valor con un varlor inicial, observen que esta sera nuestra variable estatica, la incrementaremos y enviaremos el valor fuera de la funcion, en el main tenemos un bucle que mostrara el llamado de la funcion anterior, esto lo repetiremos ciinco veces, compilemos y veamos como es su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo26
1
2
3
4
5
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Observen como incrementamos el valor de la variable estatica en cada llamada a la funcion, para que puedan entender la diferencia quiten unicamente la palabra static de la variable, compilemos nuevamente y veamos como es su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo26
1
1
1
1
1
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Ahora nunca hace ese incremento porque trabaja como todas las variables que hemos visto anteriormente, ya que una vez terminado el bloque o el llamado a la funcion, elimina el valor de memoria y vuelve a asignar el valor definido y lo vuelve a incrementar, en cambio como mencionamos anteriormente al estar establecido en el momento de compilacion lo ubica en un lugar distinto y este no se vera afectado por el valor sino por la operacion al valor almacenado ahi.

Anuncios

Esto esta muy bien pero si necesitamos de otra forma de trabajar, no depender del momento de compilacion y poder nosotros iniciar o «sembrar» por nosotris mismos un valor de una forma mas segura? aqui entran en accion las variables estaticas externas.

Anuncios

Este tipo de variables solo pueden ser accedidas por cualquier otra variable, cordigo de bloque, incluyendo bloque de funciones que esten dentro del mismo archivo donde fue declarada, una de forma de poder utilizarlo es mediante una libreria externa como vimos en algunos casos anteriores, para entenderlo vamos a generar un pequeño ejemplo, para ello primero crearemos un archivo que llamaremos generar.h y le agregaremos el siguiente codigo:

generar.h

static int numero_serie = 100;

void iniciar_serie(int semilla)
{
	numero_serie = semilla;
}

int series( void )
{
	return numero_serie++;
}
Anuncios

Aqui definiremos una variable que llamaremos numero_serie y sera la estatica, aqui le estableceremos un valor inicial de 100, luego tendremos una funcion para iniciar con otro valor a nuestra numero de series, para ello podemos pasarle un valor y este sera el que establecera, por ultimo tenemos una funcion que solo incrementara a este valor cada vez que lo llamemos y lo devolvera, nuestros siguiente paso sera crear un archivo con el nombre ejemplo27.c y le agregaremos el siguiente codigo:

ejemplo27.c

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

int main()
{
	iniciar_serie(1000);

	for (int i=0; i < 5; i++)
	{
		printf("Series: %d\n", series());
	}

	return 0;
}
Anuncios

Aqui como hemos visto en otros casos incluimos a la libreria que generamos anteriormente, despues en el main llamamos a la funcion encargada de iniciar la serie, despues por medio de un bucle for mostraremos el resultado de llamar a la funcion series, vamos a compilarlo y ver como es su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo27
Series: 1000
Series: 1001
Series: 1002
Series: 1003
Series: 1004
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Como pueden verr no solamente logramos lo mismo que antes sino que tambien agregamos la posibilidad de poder modificar el valor inicial a nuestra necesidad, algo similar a cuando hablamos de numeros aleatorios en PRNG medante este post, con todo comentado solo nos resta mencionar que el ciclo de vida de las variables estaticas tanto para internos como externso es el mismo, dado que en ambos casos se cargan en memoria antes de ejecutar cualquier instruccion, y solamente se borraran de memoria cuando el programa se termine mientras el programa este activo las variables seguiran en memoria.

Anuncios

En resumen, hoy hemos visto a las memorias estaticas, mas exactamente a la palabra clave static, como se utiliza primero para las variables de tipo internas, vimos un ejemplo para ver como diferencia entre estaticas y no, despues lo aplicamos a una variable de tipo externa, 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