TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pajaro en 06 de Septiembre de 2009, 20:39:57

Título: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: pajaro en 06 de Septiembre de 2009, 20:39:57
hola amigos

estoy desarrollando una función que se pueda llamar desde otra funcion y nos pueda retorno varios parametros.

es decir:
Código: CSS
  1. int out_cnt(int hms,int temp_hms)
  2.   {
  3.     int temp_hora[4];
  4.     switch(hms)
  5.       {
  6.         case 1: temp_hora[1]=temp_hms;break;
  7.         case 2: temp_hora[2]=temp_hms;break;
  8.         case 3: temp_hora[3]=temp_hms;break;
  9.       }
  10.    return(temp_hora[hms]);
  11. }

me tira un monton de errores, casi 50

Es posible hacer esta función, es decir una función que me retorne más de un valor y la salida se la marque yo mediante la entrada,
como si fuera un multiplexor.

Un saludo
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: RICHI777 en 06 de Septiembre de 2009, 20:59:15
Hola, te comento desde C el CCS tiene su funcionamiento particular que no siempre se comporta como es standart. El primer lugar te comento algo de como definiste la funcion, el array temp_hora se instancia desde el stack y su vision o scope es solo desde la misma función con lo cual al salir no podes garantizar que el array mantenga su valor, la conclusión es nunca devolver valores de array creados localmente. Ahora veamos como C nos permite devolver multiples valores, en este caso se usan punteros. Supongamos que necesitamos una funcion que nos devuelva la hora, minutos y segundos en tres variables:

La declaracion aca
Código: C
  1. void GetHourMinSec( byte *Hour, byte *Min, byte *Sec )
  2. {
  3.    byte Temp;
  4.    
  5.    // Como ejemplo pongo funciones que retornan los datos del RTC, es solo un ejemplo
  6.   Temp = GetHourFromRTC();
  7.   *Hour = Temp;
  8.  
  9.    Temp = GetMinFromRTC();
  10.   *Min = Temp;
  11.    
  12.    Temp = GetSecFromRTC();
  13.    *Sec = Temp;
  14. }

Y ahora para invocarla:
Código: C
  1. ...
  2.   byte H, M, S;
  3.  
  4.   GetHourMinSec( &H, &M, &S );

Aca definimos tres variables del tipo apropiado y pasamos a la función anterior un puntero a ellas, de esta manera podemos extender a nuestro gusto la cantidad de resultados.

Saludos !
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: gera en 06 de Septiembre de 2009, 21:00:02
Lo q se hace cuando queres q una funcion te devuelva varios valores, es pasarle por parametro punteros a otras variables. Entonces la funcion almacena en esas variables los valores q queres devolver.
Por ej, queremos q una funcion nos devuelva la suma y la diferencia de dos valores. Seria algo asi:
Código: C
  1. void suma_resta(int a, int b, int *suma, int *resta)
  2. {
  3.    *suma=a+b;
  4.    *resta=a-b;
  5. }

saludos!
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: Suky en 06 de Septiembre de 2009, 21:10:11
En los ejemplos de CCS se ve de la siguiente manera, es lo mismo  :?:

Código: C
  1. void suma_resta(int a, int b, int& Suma, int& Resta) {
  2.  
  3.   Suma=a+b;
  4.   Resta=a-b;
  5. }

Yo utilizo punteros cuando quiero que me devuelva por ejemplo un buffer.



Saludos!
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: RICHI777 en 06 de Septiembre de 2009, 21:13:49
Hola Suky, por eso hablaba del CCS y su funcionamiento por fuera del ANSI C, ese tipo de declaraciones no son válidas en C pero si en C++ y se llaman argumentos por referencia. La idea es la misma pero el compilador ya sabe que es un puntero y no hace falta desreferenciarlo.

Saludos !
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: Suky en 06 de Septiembre de 2009, 21:22:07
Hola Suky, por eso hablaba del CCS y su funcionamiento por fuera del ANSI C, ese tipo de declaraciones no son válidas en C pero si en C++ y se llaman argumentos por referencia. La idea es la misma pero el compilador ya sabe que es un puntero y no hace falta desreferenciarlo.

Saludos !
Ok!! muchas gracias RICHI   :-)


Saludos!
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: pajaro en 06 de Septiembre de 2009, 21:31:47
Hola amigos

La entrada a la función veo que os gusta mucho por referecia, en vez de por valor, es decir le pasais la direcion de la memoria en vez del dato almacenado en ella, en algunos compiladores solo se puede asi.

pero vuestras funciones no retornan nada no..o me lo parece a mi

void funcion (tipo var, tipo var)

yo me propongo según, le pongas en la entrada me de una salida un otra, no se donde lei que solo se le puede sacar un valor no varios,
por eso el switch, pero si queremos que nos de un valor puntero  como lo defines.

o se trata tambien como un entero.

int funcion (tipo var01, tipo var02)

que me dicen ustedes..




Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: Suky en 06 de Septiembre de 2009, 21:36:17
En la de RICHI devuelve Hour, Min y Sec, y en los otros dos ejemplos se devuelve Suma y Resta.
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: BrunoF en 06 de Septiembre de 2009, 21:41:18
Técnicamente, una función como la que Suky expuso:

Código: C
  1. void suma_resta(int a, int b, int& Suma, int& Resta) {
  2.  
  3.   Suma=a+b;
  4.   Resta=a-b;
  5. }

 no devuelve nada.

Pero si te fijás, entre los parámetros aparecen dos punteros a variables: int& Suma e int& Resta.

Por lo que la función, va a almacenar el resultado de a+b en la dirección de memoria que le pases en "Suma"  y el resultado de a-b en la dirección de memoria que le pases en "Resta".

Luego, puedes leer estas posiciones de memoria para obtener ambos resultados.

Este uso es extremadamente común en todos los niveles de programación y dll's de los sistemas operativos.

Saludos.
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: pajaro en 06 de Septiembre de 2009, 22:07:57
Hola amigos

Me estais haciendo dudar,

Código: CSS
  1. int funcion (int a, int b)
  2. {
  3. int c;
  4. c=a+b;
  5. return(c);
  6. }

es una funcion que retorna un entero, y le pasamos dos enteros


Código: CSS
  1. void funcion(int a, int b)
  2. {
  3. int c;
  4. c=a+b;
  5. }

es un procedimiento , no una funcion y no retorna nada, pero si que le pasamos dos parametros


¿Estoy en lo cierto, o en caso contrario me equivoque?

corrijanme en tal caso.

Un saludo
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: BrunoF en 06 de Septiembre de 2009, 22:41:27
Si. Es cierto.
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: RICHI777 en 06 de Septiembre de 2009, 23:16:54
Hola, eso de procedimiento y funcion es muy de Pascal, C no diferencia, todo es una funcion. Lo que decis que no se devuelve nada es correcto, la funcion que puse de ejemplo fue solo un ejemplo, pero deberia tener un retorno. Casi todas las API que vi utilizan este metodo siempre se devuelve un tipo de datos desde succes hasta el error descripitvo, y los demas retornos todos por referencia. Cuando me referia a API, digo las bien diseñadas ( Windows, Palm, etc ) el RTL no es buen ejemplo porque esta pesimamente diseñada.

Saludos !
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: gera en 06 de Septiembre de 2009, 23:20:47
Claro, yo directamente le digo funciones a todo jeje. Un procedimiento es un caso particular de una funcion q no devuelve nada.
Muchas veces una funcion devuelve el estado de la operacion q realizo. Siendo un numero positivo resultado exitoso y uno negativo resultado erroneo (podria devolver el codigo de error). Por lo tanto los parametros q recibe y devuelve se pasan por punteros y cosas al estilo.
Esto lo usamos mucho en una materia q programabamos bajo linux a nivel kernel.

saludos!!
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: BrunoF en 06 de Septiembre de 2009, 23:26:25
Bueno, creo que todos estamos de acuerdo en que no estamos siendo muy estrictos en cuanto a diferenciar función de procedimiento. Yo personalmente no uso casi la palabra procedimiento, pero si es necesario para que no te equivoques voy a intentar recordarlo.

Eso sólo se da en teoría, y la diferencia es prácticamente nula.

Si recuerdo aquello que aprendí en Informática I de la universidad, la diferencia entre función y procedimiento es que la función está obligada a devolver un valor(y sólo uno).
En cambio, el procedimiento puede no devolver valor alguno, o bien devolver uno o más de uno.

Entonces, podría sacar la conclusión y decir que: la función es un caso particular del procedimiento, cuando se devuelve uno y sólo un valor en la subrutina.

Saludos.
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: gera en 06 de Septiembre de 2009, 23:37:17
Bueno, creo que todos estamos de acuerdo en que no estamos siendo muy estrictos en cuanto a diferenciar función de procedimiento. Yo personalmente no uso casi la palabra procedimiento, pero si es necesario para que no te equivoques voy a intentar recordarlo.

Eso sólo se da en teoría, y la diferencia es prácticamente nula.

Si recuerdo aquello que aprendí en Informática I de la universidad, la diferencia entre función y procedimiento es que la función está obligada a devolver un valor(y sólo uno).
En cambio, el procedimiento puede no devolver valor alguno, o bien devolver uno o más de uno.

Entonces, podría sacar la conclusión y decir que: la función es un caso particular del procedimiento, cuando se devuelve uno y sólo un valor en la subrutina.

Saludos.

hmm, yo creo q el procedimiento es un caso particular de funcion q no devuelve nada. Pero como decis, a los fines practicos, la diferencia no importa jeje.
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: fabianjsm en 07 de Septiembre de 2009, 01:16:35
Hola pajaro, la manera de trabajar con varios argumentos es como te explico RICHI777, ademas esta en completo acuerdo con el Kernighan (la biblia del C, de Kernighan & Ritchie). Parece razonable tener sobre este tema una opinion basada en la de los mismos creadores del lenguaje! Fijate la pagina 10 (version en ingles) "...C functions are like the subroutines and functions in Fortran or the procedures and functions of Pascal"... O basta con leer la introduccion de la seccion 1.7 (pagina 25).
En conclusion, es correcto que las funciones devuelven valores, y los procedimientos no. Pero mientras que en lenguajes como Pascal se hacen distinciones entre funciones y procedimientos, en C y C++ no, en éstos sólo existen funciones. En Pascal, con procedure cremos un procedimiento, y con function una funcion, y el primero es un procedimiento y el segundo una funcion. En C podemos crear una función del tipo void y llamarle procedimiento si eso nos hace sentir mejor, pero seguira siendo una funcion. Esta es la tipica clase de discuciones que ademas de hacernos perder tiempo no nos lleva a ninguna parte, mejor dejemos esas distinciones a los que trabajan en lenguajes como Pascal, ya que a ellos si les sirve :lol:
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: fabianjsm en 07 de Septiembre de 2009, 01:23:49
Con respecto al codigo que posteaste al inicio del hilo, el unico error es la manera como definiste la funcion:

Código: C
  1. int void out_cnt(int hms,int temp_hms)
  2. {

Quitando el void compila sin problemas.
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: BrunoF en 07 de Septiembre de 2009, 01:35:54
Hola pajaro, la manera de trabajar con varios argumentos es como te explico RICHI777, ademas esta en completo acuerdo con el Kernighan (la biblia del C, de Kernighan & Ritchie). Parece razonable tener sobre este tema una opinion basada en la de los mismos creadores del lenguaje! Fijate la pagina 10 (version en ingles) "...C functions are like the subroutines and functions in Fortran or the procedures and functions of Pascal"... O basta con leer la introduccion de la seccion 1.7 (pagina 25).
En conclusion, es correcto que las funciones devuelven valores, y los procedimientos no. Pero mientras que en lenguajes como Pascal se hacen distinciones entre funciones y procedimientos, en C y C++ no, en éstos sólo existen funciones. En Pascal, con procedure cremos un procedimiento, y con function una funcion, y el primero es un procedimiento y el segundo una funcion. En C podemos crear una función del tipo void y llamarle procedimiento si eso nos hace sentir mejor, pero seguira siendo una funcion. Esta es la tipica clase de discuciones que ademas de hacernos perder tiempo no nos lleva a ninguna parte, mejor dejemos esas distinciones a los que trabajan en lenguajes como Pascal, ya que a ellos si les sirve :lol:


El que sabe,sabe! :D Olvidé mencionar que esa asignatura era en Pascal...
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: pajaro en 07 de Septiembre de 2009, 17:38:51
Hola amigos


Personalmente prefiero, programar en C o C++ que en pascal (o "pascual" como lo llamaban en la uni).

Buen ojo, Fabianjm...se me paso el void, la escribi primero como void y luego como int, pero esto como el conducir, conducir muchas horas llega un momento o descansas o cometes errores tontos, y te pueden costar caro.


un saludo.
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: RICHI777 en 07 de Septiembre de 2009, 19:10:25
Igual, al C orientando a embebidos habria que hacerles algunas mejoras para que se nos haga las cosas mas faciles, se me ocurren estas:


Saludos !

Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: PalitroqueZ en 07 de Septiembre de 2009, 23:13:54
Amigos, de lo poco que he aprendido en el mundo de la programación de los uC pic, he reconocido que hay que diferenciar los compiladores para micros, de los compiladores para ordenadores. No podemos por ejemplo hacer semejanzas con C++. tengo entendido el que plus plus significa estar orientado al objeto. Cosa que es hasta la fecha es imposible de implementar en los pics (por la limitación de los recursos)

yo en mi paso con el ccs ( y muy poquisimo con C18 y hitech) me he dado cuenta que programar en C es un avance significativo en cuanto a agilizar la programación en ensamblador, pero nada mas, igual hay que activar un pin o encender un modulo de forma como se hace en asm, nosotros escribimos una linea de C y el compilador escribe unas cuantas en asm, no podemos olvidarnos de los registros ni las banderas de las interrupciones. 

por supuesto que no olvido el RTOS (aunque sigo viendo muy pocos programas escritos en rtos)


pajaro, la forma para devolver mas de un valor en una función es con puntero. Creo que tu pregunta tiene relación con el otro tema IF - valida funciones con paso de parametros proteus - ccs

pienso que si ves que el programa se te está complicando mucho, mejor uses variables globales.

Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: fabianjsm en 08 de Septiembre de 2009, 00:13:59
tengo entendido el que plus plus significa estar orientado al objeto. Cosa que es hasta la fecha es imposible de implementar en los pics (por la limitación de los recursos)

Hay varios compiladores orientados a objetos para PIC's, el mejor de los que prove es BoostC++ que genera lindo codigo incluso para el 16f84... incluso hay una variante de java llamada Jal que soporta incluso los chiquitines 12f, -con una sintaxis bastante particular. En la fecha existe un grupo de personas trabajando en el desarrollo de gcc para pics (gcc es GNU Compiler Collection, y dentro de esta coleccion no podria falta c++). Sobre este tema hay un hilo actualmente.
Título: Re: CCS - Retorno de más de 1 parámetro - return - Proteus
Publicado por: RICHI777 en 08 de Septiembre de 2009, 10:53:48
Hola,
Citar
yo en mi paso con el ccs ( y muy poquisimo con C18 y hitech) me he dado cuenta que programar en C es un avance significativo en cuanto a agilizar la programación en ensamblador, pero nada mas, igual hay que activar un pin o encender un modulo de forma como se hace en asm, nosotros escribimos una linea de C y el compilador escribe unas cuantas en asm, no podemos olvidarnos de los registros ni las banderas de las interrupciones. 

El espiritu del C o la principal razon de existencia es la portabilidad, cuando lo diseñaron la idea fue que UNIX pueda ser facilmente portado a otras arquitecuras con otros micros sin tener que hacer todo de nuevo y sin perder la posibilidad de acceso a bajo nivel como es assembler. Por eso cuando trabajas con varios micros ( PIC, AVR, FreeScale, etc ) las cosas bien hechas y que no sean hardware dependiente son migradas sin problemas y sin tener que escribir todo de nuevo. El CCS tiene cosas muy piolas, pero te haces dependiente, si pasas a un AVR u otro micro que CCS no de soporte ahi empiezan los problemas.

Citar
Amigos, de lo poco que he aprendido en el mundo de la programación de los uC pic, he reconocido que hay que diferenciar los compiladores para micros, de los compiladores para ordenadores. No podemos por ejemplo hacer semejanzas con C++. tengo entendido el que plus plus significa estar orientado al objeto. Cosa que es hasta la fecha es imposible de implementar en los pics (por la limitación de los recursos)

El tema del C++ es practicamente un mito, ciertas caracteristicas del lenguaje ( constructores, destructores, sobrecarga de operadores, herencia simple, sobrecarga de funciones ) no implican una serie de recursos extras que no utilize lo mismo pero escrito en C plano.

Saludos !