Autor Tema: CCS - Retorno de más de 1 parámetro - return - Proteus  (Leído 9429 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
CCS - Retorno de más de 1 parámetro - return - Proteus
« 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
« Última modificación: 07 de Septiembre de 2009, 17:29:14 por pajaro »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #1 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 !

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #2 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!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #3 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!
No contesto mensajes privados, las consultas en el foro

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #4 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 !

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #5 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!
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #6 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..




« Última modificación: 06 de Septiembre de 2009, 21:33:56 por pajaro »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #7 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.
No contesto mensajes privados, las consultas en el foro

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #8 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #9 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
« Última modificación: 06 de Septiembre de 2009, 22:13:23 por pajaro »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #10 en: 06 de Septiembre de 2009, 22:41:27 »
Si. Es cierto.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #11 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 !

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #12 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!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #13 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: CCS - Retorno de más de 1 parámetro - return - Proteus
« Respuesta #14 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.

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein