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. 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. 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
|