Curso de programación PIC en C con CCS. Funciones (2)

Volver al índice

 

Continuamos con el tema de las funciones, en este caso vamos a ver a que nos referimos cuando hablamos sobre el ámbito de las funciones y también profundizaremos mas en el tema sobre el tipo de argumentos que pueden recibir las funciones, veremos que es eso de pasar un argumento por valor ó por referencia y que diferencia hay entre ambas formas, todo ello con ejemplos sencillos para entender el concepto y aplicados al compilador de CCS.

 

4. REGLAS DE ÁMBITO DE LAS FUNCIONES

Las reglas de ámbito de un lenguaje son las reglas que controlan si un fragmento de código conoce o tiene acceso a otro fragmento de código o de datos.

En C, cada función es un bloque de código discreto. El código de una función es privado a esa función, a menos que se haga a través de una llamada a esa función. (No es posible, por ejemplo, utilizar un goto para saltar en medio de otra función). El código que comprende el cuerpo de una función está oculto al resto del programa y, a no ser que se usen datos o variables globales, no puede ser afectado por otras partes del programa ni afectarlas. Dicho de otro modo, el código y los datos que están definidos dentro de una función no pueden interactuar con el código o los datos definidos dentro de otra función porque las dos funciones tienen un ámbito diferente.

Las variables que están definidas dentro de una función se llaman variables locales. Una variable local
comienza a existir cuando se entra en la función y se destruye al salir de ella. Así, las variables locales
no pueden conservar sus valores entre distintas llamadas a la función. La única excepción a esta regla  
se da cuando la variable se declara con el especificador de clase de almacenamiento static. Esto hace que el compilador trate a la variable como si fuese una variable global en cuanto a almacenamiento se refiere, pero que siga limitando su ámbito al interior de la función.

En C todas las funciones están al mismo nivel de ámbito. Es decir no se puede definir una función dentro de otra función. Sin embargo si se puede llamar a funciones desde otras funciones.

Ahora, Vamos a profundizar un poco más sobre los valores (argumentos) que le puedo pasar a la función cuando la llamo.

 

5. ARGUMENTOS DE FUNCIONES

 

5.1 Funciones sin argumentos.

 

Cuando una función se declara con el tipo void como argumento, nos está indicando que esa función
no espera argumentos.

Ejemplo:

int multiplica(void); //esta función no espera ningún argumento y devuelve un número entero.

5.2 Funciones con argumentos.

 

  • Si una función va a usar argumentos, debe declarar variables que tomen los valores de esos argumentos. A estas variables que se declaran en la propia función se les suele llamar parámetros formales de la función. Se comportan como otras variables locales dentro de la función, creándose al entrar en la función y destruyéndose al salir.
  • Hay que asegurarse que el tipo de datos de los parámetros formales sea compatible con el tipo de datos usado para los argumentos de llamada a la función. Aunque el compilador no muestre ningún error por esto, los resultados obtenidos serían imprevisibles.
  • Se pueden pasar argumentos a las funciones de dos formas:
    • Por valor
    • Por referencia


Llamadas por valor.

Este método copia el valor de un argumento en el parámetro formal de la función. De esta forma, los cambios en los parámetros de la subrutina no afectan a las variables que se usan en la llamada.  
Esto significa, en general que no se pueden alterar las variables usadas para llamar a la función.

Toda esta serie de nombres y conceptos, puede parecer un poco confuso al principio sobre todo para el que empieza por primera vez a estudiar un lenguaje de programación. Personalmente, he programado en varios lenguajes de programación y bajo mi punto de vista la única forma de entender y avanzar en el aprendizaje de un lenguaje de programación es: practicar, practicar,...., y practicar. Así que vamos ha empezar a ello, en el siguiente ejemplo vamos a ver como se le pasan los argumentos a una función por valor, los ejemplos de funciones que hemos visto anteriormente y que reciben parámetros utilizan este método, por lo que la sintaxis utilizada nos será familiar.

 

/*Ejemplo que muestra como se pasan los argumentos a una función por valor*/ 
#include <16F877A.h> 
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, WRT_50% 
#use delay(clock=4000000) 
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) 
 
int cuadrado(int x); //declaración de la función. 
 
void main() { 
 
 int t=5; 
 printf("%d %d", cuadrado(t),t);//la función printf muestra en pantalla 2 valores: el valor devuelto por la función cuadrado y el valor de la variable t, que como vemos se pasa como parámetro a la función 
} 
 
int cuadrado(int x) //int x es la declaración de la variable (parámetro formal) que va a recibir el valor del argumento de t. 
{ 
 x=x*x; 
 return(x);//la función devuelve el cuadrado de x 
}

 

Si simulamos el ejemplo con proteus, obtendremos la siguiente salida:

 

Ejemplo de funciones que admiten argumentos. Paso por valor

 

Como vemos en la imagen lo que se pasa a la función es una copia del valor del argumento. Lo que ocurra dentro de la función no tiene efecto sobre la variable utilizada en la llamada.

En este ejemplo, se copia el valor del argumento de cuadrado(t), t=5 en el parámetro x. Cuando se realiza la asignación x=x*x, el único elemento que se modifica es la variable local x. La variable t, usada para llamar a cuadrado(t), todavía tiene el valor 5.

RECUERDA: lo que se pasa a la función es una copia del valor del argumento. Lo que ocurra dentro de la función no tiene efecto sobre la variable utilizada en la llamada.


Bueno, ahora tocaría hacer un ejemplo del paso de argumentos a una función por referencia. Pero para comprender esto bien, antes debemos de tratar un tema muy importante en C que es el uso de punteros, por lo que el próximo tema tratará sobre ellos, aprenderemos a usarlos y las precauciones que tenemos que tener con ellos, veremos también algunas peculiaridades que tiene el compilador CCS en su uso.  

Como siempre espero vuestros comentarios en el foro.


Un saludo

 

Volver al índice

© 2007-2017 AquiHayapuntes.com