HOME

PRODUCTOS

PROYECTOS

TUTORIALES

VIDEOS

FREEWARE

PROGRAMAS

FUNCIONES C

EMPRESA

ENGLISH

                   

tutorial: el uso de pointers, parte II

 

 

pointer.jpg (50856 bytes)

 

COMO PASAR PARÁMETROS A UNA FUNCIÓN POR VALOR Y POR REFERENCIA

Click aquí para regresar a la PARTE I del tema

Las funciones en ANSI C tienen dos maneras de pasar parámetros, ya sean de entrada ó salida: por valor y por referencia. En el tema "Uso de funciones en ANSI C", se vió un ejemplo pasando los parámetros por valor. En este tema veremos como pasar parámetros por referencia, es decir, usando pointers.

Los parámetros ó argumentos en las funciones, son variables locales. Esto significa que solamente son válidas adentro de la función. Al salir de ella, el contenido de las localidades de memoria en donde fueron temporalmente almacenadas, es destruído. Ésto plantea un problema: ¿que hacer cuando requerimos utilizar el valor de alguno de los parámetros al regresar de esta función?

La respuesta es pasar los parámetros "por referencia", mediante el uso de pointers. De acuerdo a lo explicado en el párrafo anterior, el pointer es una variable local adentro de la función y de hecho se destruye al salir de ella. Pero a través de él, podemos realizar el direccionamiento indirecto hacia la variable que deseamos entregar al usuario de la función como parámetro de salida.

Tanbién es posible, haciendo uso de pointers, pasar a la función  arreglos ó strings. En un segundo ejemplo, se muestra esta posibilidad.

Veamos en el siguiente ejemplo, cuya ventana en MPLAB se muestra abajo, cómo se usan los pointers para el manejo de parámetros: deseamos sumar las variables a y b, mediante una función que nos regresará el valor en una variable llamada suma.

Creamos la función "wibo( )", la cual realizará la suma: void wibo (int x, int y, int*z).

Observe como se pasa la variable suma a la función, usando direccionamiento indirecto: wibo(a,b,&suma);

Los parámetros a y b los pasamos "por valor" a la función wibo( ). Pero suma se pasa "por referencia".

&suma significa "la dirección de memoria en donde se almacena la variable suma". La función recibe este valor y lo almacena en z. De tal manera que, en lugar de usar directamente la variable suma, usamos la expresión equivalente *z que significa: "el contenido de la localidad a donde está apuntando z".

Adentro de la función, la operación se realiza mediante la expresión:

*z=x+y;               //realiza la operación y tranfiere el resultado a la variable "suma" con direccionamiento indirecto.

Y regresando de la función, mostramos el valor de suma en los LEDS del puerto B. Compile y simule paso a paso este programa, observando el resultado en el puerto B. Se recomienda realizar otras pruebas con variantes al programa, como por ejemplo efectuar una multiplicación.

wpe4.jpg (55879 bytes)

COMO PASAR "POR REFERENCIA" UN ARREGLO A UNA FUNCION:

Veamos ahora el siguiente ejemplo, más elaborado: la siguiente función, al ser llamada, recibe varios caracteres del puerto serial, enviando ECO después de cada uno de ellos. El número de caracteres es variable y termina cuando el usuario oprime la tecla "CR". La función regresa al programa principal "main", pasando como parámetro ó argumento, un arreglo con formato de string. Este arreglo contiene en sus elementos los códigos ASCII de cada caracter enviado, terminando con un caracter "NULL".

Previamente, antes de llamar a la función, es necesario, en el programa principal, definir el arreglo como variable global:

char array[7];                      //se define un arreglo de 7 elementos

RCVECO(&array[0]);   //aquí se llama a la función "por referencia", usando el compilador CCS

El arreglo "array" pasa a la función como un pointer (int *x), que inicialmente apunta hacia el primer elemento del arreglo. Observe que, una vez adentro de la función, el pointer puede apuntar hacia cada uno de los demás elementos, utilizando el formato *(x+a). Al regresar de la función, el arreglo "array" contiene el string deseado.

El archivo de texto de esta función es el siguiente: RCVECO.txt Usted puede copiar y pegar el contenido para usarlo en su programa de aplicación.

wpe4.jpg (42811 bytes)

En este otro ejemplo usando el compilador HiTech, el arreglo que "pasa" a la función micros( ) (ver imagen abajo), fué definido de esta forma:

int res[12];

n2=micros(res,n1);

Observe como en caso de HiTech, al llamar a la función es suficiente con escribir el nombre del arreglo, sin necesidad de incluir el símbolo '&' . Puede ver el archivo completo, junto con la explicación de los parámetros de entrada y salida aquí: HITECH-MICROS-TINY.c

Click aquí para regresar a la PARTE I del tema