Anuncios

Bienvenidos sean a este post, hoy nos alejaremos un poco de los apuntadores.

Anuncios

En este post cuando hablamos de las funciones mencionamos que podiamos pasar datos como argumentos para las mismas, estas se las denominan llamada por valor (call-by-value), es decir que al momento de definir una funcion para tomar argumentos los valores que recibe para utilizar son copias de los valores que pasamos al llamar a la funcion, para entenderlo vamos a crear un nuevo ejemplo, primero generen un nuevo archivo llamado ejemplo12.c y lo siguiente sera agregar el siguiente codigo:

ejemplo12.c

#include <stdio.h>

double PerimRect(double al, double an)
{
	al += 10;
	an += 10;
	return 2*(al + an);
}

int main()
{
	double alto = 15.0;
	double ancho = 22.5;
	double perimetro = PerimRect(alto, ancho);
	printf("Alto: %.1f\nAncho: %.1f\nPerimetro: %.2f\n", 
		alto, ancho, perimetro);
	return 0;
}
Anuncios
Anuncios

Este es un ejemplo simple para ver lo mencionado anteriormente, pero antes de hablar sobre la funcion hablemos sobre el main, en este caso definiremos dos variables para el ancho y el alto, lo siguiente sera definir una nueva variable donde almacenaremos la devolucion de la funcion PerimRect, y a esta le pasaremos las dos variables anteriores como argumentos, por ultimo mostraremos los valores de las tres variables, ahora pasemos a comentar la funcion.

Anuncios
Anuncios

Esta funcion calculara el perimetro de un rectangulo, observen que recibira los valores para el alto y el ancho, en el bloque incrementaremos ambos valores para luego devolver el resultado del calculo del perimetro, como dijimos al comienzo no trabajaremos sobre los variables directas sino que simplemente recibiremos una copia de los valores y los asignaremos a estas variables, esto hara que las modificaciones realizadas no afectan a los valores originales, ccompilemos y veamos como es su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo12 
Alto: 15.0
Ancho: 22.5
Perimetro: 115.00
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Si bien para determinados programas es una opcion segura pero tambien dependera el tipo de informacion que vamos a manipular, si son datos muy grandes puede traernos problemas de memoria a largo plazo, pero si queremos que nuestra informacion se modifique en la funcion que utilizamos? una opcion es a traves de un objeto de struct, tomemos el codigo anterior y modifiquemoslo de la siguiente manera:

#include <stdio.h>

typedef struct DimRect
{
	double alto;
	double ancho;
	double perimetro;
} DimRect;

DimRect PerimRect(DimRect dim_rec)
{
	dim_rec.alto += 10;
	dim_rec.ancho += 10;
	dim_rec.perimetro = 2*(dim_rec.alto + dim_rec.ancho);
	return dim_rec;
}

int main()
{
	DimRect dr;
	dr.alto = 15.0;
	dr.ancho = 22.5;
	dr = PerimRect(dr);
	printf("Alto: %.1f\nAncho: %.1f\nPerimetro: %.2f\n", 
		dr.alto, dr.ancho, dr.perimetro);
	return 0;
}
Anuncios
Anuncios

Vamos a hablar sobre las modificaciones, la primera sera un struct donde tendremos todas las dimensiones de nuestro rectangulo, incluido el perimetro, para este struct usamos a typedef para facilitarnos su llamado, si quieren saber mas les recomiendo visitar este post, lo siguiente fue redefinir a nuestra funcion donde en lugar de devolver un tipo double nos entregara uno del tipo del struct, a su vez en lugar de recibir los dos datos sera receptor de un objeto del mismo tipo, DimRect, en el cuerpo de la funcion volveremos a incrementar el valor de alto y ancho en 10, pero ahora en la variable perimetro del struct almacenaremos el resultado de la operacion, y por ultimo devolveremos el objeto del argumento, para ir finalizando veamos las modificaciones en el main, primero crearemos un objeto del struct que definimos al comienzo, luego estableceremos en el objeto al resultado de la funcion PerimRect y a este le pasamos como argumento el mismo objeto, por ultimo mostraremos los valores contenidos en el objeto, compilemos y veamos como es su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo12 
Alto: 25.0
Ancho: 32.5
Perimetro: 115.00
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Observen que ahora si estamos con los valores modificados, como pueden ver esto es muy complejo pero con apuntadores esto se puede facilitar aunque este es un tema que veremos en el proximo post.

Anuncios

En resumen, hoy hemos hecho un repaso de como se pasan los argumentos a las funciones, como lo hacen realmente, como esto puede ser provechoso, como podemos hacer para que trabaje de forma diferente, 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