Funciones en C/C++

c_c_plus_plusHemos tenido que trabajar con programacion en C y sobre todo, funciones para modularizar todo el codigo y crear subrutinas en el uC PIC con el  Compialdor CCS. Y esta info la encontré interesante y teórica, que puede ser vista más generalmente y servirle seriamente a alguien que estará programando en un tiempo mas programillas en C para el ramo de Computación.

Este minitutorial solo tiene lo referente a como se crean funciones prototipo y depende del compilador como hay que declararlas pero puedes rescatar harto de esto. Hace tiempo que deje de programar en C++ (o C– como dirán otros) hablando mas purista. He tenido que aprender para programar uC PIC con CCS y con el IDE de C que tiene la placa embebida Arduino así que digo desde ya que si en algunas cosas puede cambiar a lo que le enseñan.

Funciones Prototipos:

Dos métodos son usados para informar al compilador que tipo de valor de la función retorna. La forma general es:

Tipo nombre_de_funcion();

Por ejemplo,  la sentencia en sum() podría decirle al compilador que la función sum() retorna un valor entero. La segunda forma es informar al compilar acerca del valor de retorno de una función es de una función prototipo. Una función prototipo no solo da el valor de la función, sino que también declara el número y el tipo de argumentos que la función acepta. El prototipo debe coincidir con la declaración de la función exactamente.

Los prototipos ayudan al programador a identificar errores en la programación reportando cualquier conversión ilegal de tipo entre los argumentos que pasan a la función y la declaración de la función. Esto también permite si el número de argumentos enviados a la función no son los mismos especificados en la declaración de la función.

El formato genera para un prototipo de función es mostrado como sigue:

Tipo nombre_de_funcion(tipo var1, tipo var2, tipo var3, …);

En el siguiente ejemplo, cada tipo de variable puede ser distinto. En el ejemplo de la función protipo es mostrado en este programa. La función calcula el volumen definido por el largo, ancho y alto.

int volume(int s1, int s2, int s3);

void main()

{

int vol;

vol = volume(5,7,12);

printf(“volume: %d\n”,vol);

}

int volume(int s1, int s2, int s3)

{

return s1*s2*s3;

}

Note que el return usa una expresión en vez de una constante o una variable.La importancia de los prototipos no sería notoria con pequeños programas. Sino que seria, cuando el tamaño del programa crece de algunas líneas a cientos de líneas. Debido a esto, la importancia de los protipos para la reparación de errores es evidente.

Void

Una excepción es cuando la función no devuelve algún valor de la función hacia afuera. Esta función podría ser declarada como sigue:

Void nothing(void)

Un ejemplo de esto podría ser:

double pi(void) //defining the function

{ //with nothing passed in

return 3.1415926536; //but with pi returned

}

main()

{

double pi_val;

pi_val = pi(); //calling the value of pi

printf(“%d\n”,pi_val);

}

Usando argumentos en la función.

Un argumento de función es un valor que es pasado a la función cuando esta función es llamada. El C permite desde cero argumentos en adelante ser entregados a las funciones. El numero de argumentos que puede pasar a la función depende del compilador, pero el estándar ANSI C especifica que una función podría ser capaz de recibir al menos 31 argumentos.

Cuando la función es definida, variables especiales son declaradas para recibir los parámetros. Estas variables especiales son definidas como parámetros formales. Los parámetros son declarados entre los paréntesis que siguen al nombre de la función. Por ejemplo, la función de más abajo calcula e imprime la suma de dos enteros que son enviados a la función cuando esta es llamada.

void sum(int a, int b)

{

printf(“%d\n”,a+b);

}

Un ejemplo de cómo es llamada esta función desde el programa sería:

void sum(int a, int b); //This is a function prototype

main()

{

sum(1,10);

sum(15,6);

sum(100,25);

}

void sum(int a, int b)

{

printf(“%d\n”,a+b);

}

Cuando sum() es llama, el compilador copiará el valor de cada argumento en las variables a y b. Es importante recordar que los valores enviados a la función (1,10,15,6,100,25) son llamados argumentos y las variables a y b son llamados parámetros formales.

Las funciones pueden enviar argumentos de dos maneras. La primera forma es llamada “llamada por valor”. Este método copia el valor de un argumento en el parámetro formal de la función. Cualquier cambio generado en el parámetro formal no afectará el valor original de la rutina llamada. El segundo método es llamado “llamada por referencia”. En este método, la dirección del argumento es copiada en el parámetro formal. Dentro de esta función, el parámetro formal se usa para acceder a la variable actual en la rutina llamada. Esto quiere decir pueden hacer que la variable usada en el parámetro formal cambie. Esto se discutirá en el capítulo de punteros. Por ahora, solo usaremos el método de  llamada por valor cuando pasamos argumentos a la función.

Usando funciones para retornar Valores.

Cualquier función en C puede retornar (devolver) algún valor de la rutina llamada. Típicamente, la función es puesta al lado derecho del signo igual (=). El valor de retorno no necesariamente tiene que ser usada en una sentencia de asignación, pero podría ser usada en una sentencia printf(). El formato general para decirle al compilador que devuelva un valor de la función es el siguiente:

tipo nombre_de_funcion(formal parameters)

{

<statements>

return valor;

}

Donde tipo especifica el tipo de dato del valor que retorna a la función. Una función puede retorna cualquier tipo de dato a excepción de un arreglo. Si no se especifica el tipo de dato, entonces el compilador C asume que la función que retorna es un entero (iny). Si tu función no retorna u valor, el estándar ANSI C especifica que la  función retornaría es del tipo void. Esto explícitamente le dice al compilador que la función no tiene un valor a retornar. Este ejemplo muestra el uso típico para una función que retorna un valor:

#include <math.h>

main()

{

double result;

result = sqrt(16.0);

printf(“%f\n”,result);

}

Este programa llama a la función sqrt() la cual retorna un numero en punto flotante. Este número es asignado a la variable result. Notar que el archivo cabecera math.h es incluido debido a que contiene información referente que es usada por el compilador.

Es importante que coincida el tipo de dato del valor de retorno de la función con el tipo de datos de la variable que se le asignará. Lo mismo se aplica para los argumentos que son enviados a la función.

Entonces, como hacemos retornar el valor desde una función?. La forma genera es:

return nombre_de_la_variable;

Donde nombre_de_la_variable es una constante, variable  una expresión de C que sea válida y que tenga el mismo tipo de dato que el valor de retorno. El siguiente ejemplo muestra a ambos tipo de funciones.

func();

sum(int a, int b);

main()

{

int num;

num = func();

printf(“%d\n”, num);

num = sum(5,127);

printf(“%d\n”,num);

}

func()

{

return 6;

}

sum(int a, int b)

{

int result;

result = a + b;

return result;

}

Una cosa importante acerca de esto, es cuando una sentencia es encontrada, la función retorna inmediatamente la rutina llamada. Cualquier sentencia después del return no será ejecutada. El valor de retorno de una función no es requerido para asignarse a una variable o para ser usado en una expresión, por lo tanto, si este no es el valor se pierde.

Declaración clásica y moderna de funciones.

La versión original de C usa un método diferente para la declaración de parámetros formales. Esta forma, es llamada ahora la forma clásica, y es mostrada abajo:

type function_name(var1,var2,…varn)

type var1;

type var2;

.

type varn;

{

<statements>

}

Notar que la declaración es dividida en dos partes. Solo los nombres de los parámetros son incluidos dentro del paréntesis. Fuera de los paréntesis son declarados los tipos de datos y parámetros formales.

La forma moderna, el cual se ha visto en los ejemplos anteriores, está dada por:

Tipo nombre_funcion(tipo var1, …., tipo var n)

En este tipo de declaración, los parámetros formales y los tipos de datos son especificados entre el aprentesis.

El estándar ANSI C permite ambas declaraciones de funciones. El propósito es mantener la compatibilidad con programas ntiguos de C los cuales son literalmente billones de líneas de código C.

0 comments

Deja un comentario