facebook cdr twitter cdr   instagram cdr
Miércoles, 08 November 2017 14:19

9. Funciones

Escrito por
Valora este artículo
(2 votos)

Como vimos anteriormente C tiene como bloque básico la función principal main(), también hemos visto la sentencia printf() que es otra función, y de igual forma hay muchas más funciones predefinidas, pero nosotros mismos también podemos definir nuestras propias funciones. De hecho, es fundamental hacerlo. Podemos definir una función cualquiera de la misma manera en que definimos la función main(). Basta con poner su tipo, su nombre, sus argumentos entre paréntesis y luego, entre llaves, su código:

cap26

Este código es en todo equivalente al "Hola Mundo" original, sólo que nos muestra cómo escribir y cómo utilizar una función. Y además nos muestra un principio de buena programación: meter las sentencias que "hacen el trabajo" en otras funciones específicas para sacarlas de main(), dejando en ésta tan sólo un guión general de lo que hace el programa, no las órdenes específicas. De esta manera se facilita la comprensión del programa, y por tanto el futuro trabajo de modificarlo.

9.1 La sentencia return

La sentencia return puede utilizarse dentro de una función para terminar su ejecución. En el ejemplo anterior, la función holamundo fue declarada con valor de retorno de tipo void (es decir, valor de retorno nulo). En ese caso, la sentencia return no lleva ningún parámetro adicional, ya que la función no debe devolver ningún valor a la función que la llama.

En cambio, la función main tiene un valor de retorno de tipo int, por lo que return debe ir seguido de un valor entero (0 en el ejemplo). El valor 0 se utiliza para indicar que el programa ha llegado a un punto en el que todo se ha desarrollado correctamente y se utiliza cualquier otro valor para indicar que ha habido algún tipo de error.

La instrucción return no es una función, se trata de una sentencia que lo que hace es retornar como valor de la función el valor que se le proporciona como argumento. Las funciones también pueden recibir argumentos o parámetros, para modificar su comportamiento. Por ejemplo, la definición de una función para sumar dos números recibiría como argumentos los dos numero a operar.

9.2 Declaración y definición

¿Qué pasaría si escribiéramos las funciones predefinidas despues de la funcion main?

cap27

En este caso el programa es erróneo y no compila, ya que en la línea donde se llama a la función sumar, el compilador aún no conoce ninguna función con ese nombre, y cuáles son sus argumentos y valor de retorno. Una posible solución es declarar el prototipado de la función al principio, para informar al compilador que existe, y luego definir el cuerpo de la misma en cualquier lugar del programa:

cap28

9.3 Pase de parámetros

Las funciones pueden recibir datos(mayormente llamados parámetros o argumentos) como lo hemos observado, pero existen dos formas de enviar los datos hacia una función: por valor y por referencia, las cuales modifican en diferente forma el comportamiento del programa.

9.3.1 Por Valor

El paso por valor envía una copia de los parámetros a la función por lo tanto los cambios que se hagan en ella no son tomados en cuenta dentro de la función main(). Ejemplo:

cap29

9.3.2 Por Referencia

El paso por referencia se hace utilizando punteros. Se envía la dirección de memoria de la variable, por lo tanto los cambios que haga la función si afectan el valor de la variable. Ejemplo:

cap30

Es probable que hayas notado que para definir valor de la variable numero no se haya puesto simplemente el nombre de la variable sino que se le antecedió un asterisco(*). Esta sentencia es relativa a los punteros y se explica mejor en su apartado correspondiente.

9.4 Scope de las variables (globales y locales)

Además de pasar valores a una función, también se pueden declarar tipos de datos dentro de las funciones, estos tipos de datos declarados dentro de una función solo son accesibles dentro de esta misma función y se les conocen como variables locales, así pues podemos definir los mismos nombres de variables en diferentes funciones, ya que estas variables solo son accesibles dentro de esas funciones. Ejemplo:

cap31

En este caso la variable dato de cada funcion, esta definida dentro de cada una de las funciones correspondiente y son totalmente distinta una de otra y no se puede utilizar fuera de esta, así pues dato2 no puede ser utilizada por la funcion1() y dato1 tampoco puede ser utilizada por funcion2().

Existen pues variables que se definen fuera de la función principal main() y fuera de cualquier otra función creada por nosotros, estas variables se les conoce con el nombre de Variables Globales ya que se pueden utilizar dentro de main() y dentro de cualquier función creada por nosotros. Ejemplo:

cap32

En este caso, valorGlobal puede ser utilizada por cualquier funcion ya que se encuentra fuera del cuerpo de cualquiera de estas. En cambio, valorLocal solamente puede ser utilizado por la funcion principal main() a menos de que este sea parametrizado a otra función.

 9.5 Variables estáticas

Otro tipo de almacenamiento son las variables estáticas identificadas por la palabra reservada static. Las variables estáticas pueden ser tanto locales como globales. Una variable estática local, al igual que una variable automática, está únicamente asociada a la función en la que se declara con la salvedad de que su existencia es permanente.

En otras palabras, su contenido no se borra al finalizar la función, sino que mantiene su valor hasta el final del programa. Por ejemplo, en el siguiente programa declaramos la variable contador como estática dentro de la función imprimeValor y desde la función main() llamamos a esta función varias veces:

Ejemplo:

cap33

La primera vez que se llama a la función imprimeValor se inicializa su valor a cero, y tras imprimir su valor se incrementa éste. En las sucesivas llamadas, el valor de la variable contador se mantiene y el resultado es el siguiente:

cap35

Como hemos visto, el valor de la variable contador se mantiene de una llamada a otra de la función imprimeValor. Esto quiere decir que las variables locales estáticas proporcionan un medio privado de almacenamiento permanente en una función.

Por otro lado, la aplicación del calificador static a variables globales hace que a éstas sólo se pueda acceder desde el fichero fuente en el que se definieron y no desde ningún otro fichero fuente. Por ejemplo, si definimos las variables globales tiempo y reloj en el siguiente archivo fuente:

cap36

Cualquier otra función que forme parte de la aplicación y que no forme parte de este archivo fuente no podrá disponer de acceso a tiempo ni a reloj. Es más, se pueden utilizar los mismos nombres para definir variables en funciones en otros archivos sin ningún tipo de problema.

Al igual que las variables globales, las funciones son objetos externos cuyos nombres, generalmente, se desea que se conozcan de manera global. Sin embargo, en algunas situaciones resulta deseable limitar dicho acceso al archivo en el que se declara la función.

En estos casos, se utiliza la palabra reservada static y su mecanismo de aplicación es similar al caso de las variables, como podemos apreciar en el siguiente ejemplo:

cap37

Limitar el acceso tanto a variables globales como a funciones, mediante su declaración como estáticas, resulta útil en algunas situaciones en las que se quiere evitar que entren en conflicto con otras variables o funciones, incluso inadvertidamente.

9.6 Variables de registros

Cuando declaramos una variable como variable de registro, le estamos diciendo al compilador que queremos que la variable se almacene en un lugar de rápido acceso, generalmente en los registros de la unidad central de procesamiento del ordenador. Para declarar una variable como variable de registro, debemos colocar la palabra reservada register antes de la declaración de la variable.

Veamos algunos ejemplos:

register int contador:

register char a;

Sólo se pueden declarar variables como register si son variables automáticas (locales) o argumentos formales de una función. Veamos un ejemplo de la utilización de register en los argumentos formales de una función:

funcion_A (register int entrada, register int numero){ ... }

 

Visto 348 veces Modificado por última vez en Miércoles, 14 March 2018 16:16
Alejandro Carreño

Desarrollador, Programador, Web Master y Community Manager de CDR Consultores

Deja un comentario

Asegúrese de introducir toda la información requerida, indicada por un asterisco (*). No se permite código HTML.

Tweets

RT @cdrconsultores: Descubre aquí los consejos para evitar errores de gestión empresarial -> https://t.co/sXjnWiVsYR https://t.co/RfDxmfZhbx
Descubre aquí los consejos para evitar errores de gestión empresarial -> https://t.co/sXjnWiVsYR https://t.co/RfDxmfZhbx

Productos

Servicios

servicios off
website off
desarrollo off
formacion off
negocios off

Facebook

end-logo

 

Nestor M. Carreño T. - Todos los Derechos Reservados
Rescindir de Dios y de los valores morales, lleva no sólo al empobrecimiento espiritual, sino también al empobrecimiento material
Gracias a Usted, Muchas Gracias por Consultarnos, Dios le Bendiga!

Diseño y Desarrollo Nestor M. Carreño T. - CDR Consultores, C.A.