Autor Tema: Duda con funciones_  (Leído 2228 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Duda con funciones_
« en: 01 de Noviembre de 2010, 19:09:13 »
Hola a todos,
en primer lugar gracias de antemano por vuestra ayuda, despues de unos años estoy comenzando a programar de nuevo y he empezado con ccs, estoy tratando de comprender como funcionan las funciones el los aspectos de recibir argumentos y delvolver valores, este es un codigo que estoy simulando en proteus, he probado de mil maneras y no consigo que la variable sumaenmain se iguale a suma, siempre esta en 0, este es el código(gracias otra vez);
//DEMOSTRACION DEL FUNCIONAMIENTO DE LAS FUNCIONES
#include "C:\Documents and Settings\XXX\Datos de programa\PICC\Projects\prueba_funciones\funciones_v1.h"
int resultado(int a,int b); //DECLARAMOS FUNCION
void main(int x)//declaramos x como argumento donde recibir el valor de suma
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DIV_BY_1,32,1);
   setup_ccp1(CCP_OFF);
   set_pwm1_duty(0);
   int a=3;//variable local a =5
   int b=3;//variable local b =5
   int sumaenmain;//variable de resultado suma en main para ver si main ha recibido suma del return de la f resultado
resultado(a,b);//llamamos a la funcion y enviamos el valor de a  y de b
sumaenmain=x;
}
int resultado(int a, int b)
{
int suma;
suma=a+b;
return suma;
}


Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Duda con funciones_
« Respuesta #1 en: 01 de Noviembre de 2010, 19:19:38 »
Hola diegostreetbob, puedes subir el archivo funciones_v1.h ?

Saludos!

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Duda con funciones_
« Respuesta #2 en: 01 de Noviembre de 2010, 19:23:51 »
Hola,
he subido el .C,  el .h incluye esto, no se si me explico,(muchas gracias por tu interes)
#include <16F877.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES DEBUG                    //Debug mode for use with ICD
#FUSES RESERVED                 //Used to set the reserved FUSE bits
#use delay(clock=4000000)

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Duda con funciones_
« Respuesta #3 en: 01 de Noviembre de 2010, 20:18:56 »
Fijate en los cambios de los fuses y en el orden que van por ejemplo las variables que declaras en el main().  También puedes ver el uso de la función.  Lo puse todo en un solo archivo, aunque puedes simplemente hacer los cambios en el .h y en el .c

Código: [Seleccionar]
//DEMOSTRACION DEL FUNCIONAMIENTO DE LAS FUNCIONES

#include <16F877.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=4000000)

int resultado(int a,int b); //DECLARAMOS FUNCION

void main()
{
   int a=3;//variable local a =5
   int b=3;//variable local b =5
   int sumaenmain;//variable de resultado suma en main para ver si main ha recibido suma del return de la f resultado

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);

   sumaenmain = resultado(a,b);//llamamos a la funcion y enviamos el valor de a  y de b
   
   while(true);
}

int resultado(int a, int b)
{
   return a+b;
}

Como tienes pensado visualizar los resultados?

Saludos!

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Duda con funciones_
« Respuesta #4 en: 02 de Noviembre de 2010, 05:37:02 »
Hola,
esta noche lo pruebo a ver que tal va.
Realmente no quiero visualizar los resultados, simplemente depurandolo con proteus y viendo el valor que adquieren las variables, ya que vengo del picbasic y estoy comenzando con C, mi idea es aprender muy bien con funcionan las funciones.

De todos modos me gustaria saber:
1º Porque has puesto las funciones inmediatamente despues del main()
2º Imaginate la funcion "resultado" tiene varias operaciones las cuales tienen su resultado en una variable llamada "suma" por ejemplo, y yo quiero devolver este valor de "suma" a la funcion de de llamada, en este caso main(),¿ me entiendes?

Muchas gracias, de verdad, lo pruebo y seguimos hablando.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Duda con funciones_
« Respuesta #5 en: 02 de Noviembre de 2010, 10:29:27 »
De los muchos libros sobre programación en C que hay, se puede ver que la estructura general de un programa en C se hace generalmente en el siguiente orden:

Código: [Seleccionar]
#DIRECTIVAS DEL PREPROCESADOR

//DECLARACIÓN DE PROTOTIPOS DE FUNCIONES

//DECLARACIÓN DE VARIABLES GLOBALES

// PROGRAMA PRINCIPAL
main()
{
variables locales;
bloque de sentencias;
llamadas a las funciones;
}

// DEFINICIÓN DE FUNCIONES
funcion_1()
{
variables locales a funcion_1;
bloque de sentencias;
llamada a otra(s) funcion(es);
}

funcion_2()
{
variables locales a funcion_2;
bloque de sentencias;
llamada a otra(s) funcion(es);
}

funcion_n()
{
....
}

Lo normal es que si se respeta este orden al programar, no se tengan problemas a la hora de compilar a menos que los problemas sean por otras razones.

No se si te entendí bien la segunda pregunta, auque déjame decirte que como tenías la función resultado() con la variable suma es una forma correcta de hacerlo, solo que como costumbre me gusta tratar de hacer los programas por la vía más corta posible siempre y cuando no se pierda la eficiencia.  En todo caso si fuera el caso de muchas operaciones o de una función muy compleja, es normal utilizar variables en ella.

Saludos!

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Duda con funciones_
« Respuesta #6 en: 02 de Noviembre de 2010, 11:49:08 »
hola Diego, los valores que puede tomar la función main vienen del precompilador y no del mismo nucleo del programa, así que en la variable x siempre va a ser un valor cero o arbitrario. No estoy muy familiarizado con esta técnica así que puede que este equivocado, pero básicamente es así.

La forma de que el retorno a la llamada a la función resultado() lo puedas usar es que lo asignes a una variable, o lo uses en alguna función lógica.
Así como te lo expresó bmb seria lo correcto.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Duda con funciones_
« Respuesta #7 en: 02 de Noviembre de 2010, 11:53:05 »
Esta noche hago la prueba y os comento, muchas gracias.

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Duda con funciones_
« Respuesta #8 en: 02 de Noviembre de 2010, 18:44:32 »
Hola compañeros,
he probado la propuesta de bmb y efectivamente funciona perfectamente, pero imaginemos que tengo una funcion que lee del adc y guardo el valor de lectura en una variable y quiero devolver con un return el resultado de esta variable a la funcion principal y en estar trabaja con este valor retornado¿me explico? os pego el código en el que ya funciona todo, pero realmente da igual poner el return(suma) que no ponerlo, o sea que sigo si ver como el valor de return(suma) pasa a la funcion que la ha llamado, no se si me explico. gracias otra vez, de verdad.
//DEMOSTRACION DEL FUNCIONAMIENTO DE LAS FUNCIONES
#include <16F877.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#use delay(clock=4000000)
int resultado(int a,int b); //DECLARAMOS FUNCION
int suma;//esta variable ha de ser global porque se usa en una funcion distinta a main()
void main()
{
   int a=3;//variable local a =5
   int b=3;//variable local b =5
   int sumaenmain;//variable de resultado suma en main para ver si main ha recibido suma del return de la f resultado
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   while(true)
   {
   sumaenmain=suma;
   resultado(a,b);//llamamos a la funcion y enviamos el valor de a  y de b
   }
}

int resultado(int a, int b)
{
   suma=a+b;//la variabla global suma tiene el valor de a+b
   return suma;//este return da igual ponerlo o no ya que ya tenemos a+b en suma
}

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Duda con funciones_SOLUCIONADO
« Respuesta #9 en: 02 de Noviembre de 2010, 19:11:21 »
 :) Por fin, tema solucionado, muchas gracias por vuestros consejos y ayuda, por fin lo he comprendido, el código queda asi:
//DEMOSTRACION DEL FUNCIONAMIENTO DE LAS FUNCIONES
#include <16F877.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#use delay(clock=4000000)
int resultado(int a,int b); //DECLARAMOS FUNCION
void main()
{
   int a=3;//variable local a =5
   int b=3;//variable local b =5
   int sumaenmain;//variable de resultado suma en main para ver si main ha recibido suma del return de la f resultado
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   while(true)
   {
   resultado(a,b);//llamamos a la funcion y enviamos el valor de a  y de b
   sumaenmain=resultado(a,b);//asignamos el valor de resultado de la funcion resultado a sumaenmain o sea
   //que el return(suma)=resultado(a,b)
   }
}

int resultado(int a, int b)
{
   int suma;
   suma=a+b;//la variabla global suma tiene el valor de a+b
   return (suma);//este return da igual ponerlo o no ya que ya tenemos a+b en suma
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Duda con funciones_
« Respuesta #10 en: 02 de Noviembre de 2010, 19:42:10 »
  Correcto.
  En el primer caso te daba lo mismo porque suma era una variable global, eso quiere decir que la podés trabajar tanto en el main como en las funciones.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Duda con funciones_
« Respuesta #11 en: 02 de Noviembre de 2010, 21:18:30 »
Me alegra que lo hayas solucionado y entendido.  Es tal cual te dice AngelGris.

Saludos!

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Duda con funciones_
« Respuesta #12 en: 02 de Noviembre de 2010, 22:52:17 »
Hola, algunos comentarios. Tecnicamente hablando no existe el precompilador, el proceso de compilación viene precedido por el prepocesado ( que es el que resuelve los defines y los includes ). Basicamente el o los parametros que recibe el main son implementación dependiente y es decidido en el modulo startup.c,  algunas plataformas lo nombran diferente. Este módulo normalmente es un mix entre C y Assembler y sus funciones básicas son:

  • Inicializar todas las variables globales inicializadas ( recordar que los valores son almacenadas en ROM )
  • Inicializar todas las variables no incializadas a 0
  • Inicializar el stack
  • Inicializar el heap si es necesario
  • Llamar a main

Uno puede modificar este archivo y pasarle a main los parametros que uno quiere a main, la forma de hacerlo es tambien aplicacion dependiente, en algunas plataformas solamente con pushear valores en el stack alcanza, en otras los parametros se salvan en registros.

Saludos !

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Duda con funciones_
« Respuesta #13 en: 03 de Noviembre de 2010, 08:27:30 »
gracias Richi por la data  ;-)

Diego, fijate en esta parte del código

while(true)
   {
   resultado(a,b);//llamamos a la funcion y enviamos el valor de a  y de b Esta instrucción esta de mas, en la de abajo es donde se resuelve el llamado a resultado(a,b)
   sumaenmain=resultado(a,b);//asignamos el valor de resultado de la funcion resultado a sumaenmain o sea
   //que el return(suma)=resultado(a,b)
   }

Es decir, poner resultado(a,b) es lo mismo que poner directamente el valor 6 en este caso.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado diegostreetbob

  • PIC12
  • **
  • Mensajes: 51
Re: Duda con funciones_
« Respuesta #14 en: 03 de Noviembre de 2010, 11:24:31 »
Efectivamente funcioa igual, muchas gracias.