Autor Tema: Duda sobre paso de variables  (Leído 2465 veces)

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

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Duda sobre paso de variables
« en: 31 de Octubre de 2008, 16:45:20 »
A ver si consigo explicar la duda que tengo

Si yo uso en una funcion como parametro la siguiente variable
 float salida funcion(float variable1, float variable2...)
{
uso la variable en lo que sea
return salida;
}

Puedo pasar una variable global a esa funciona simplemente asi

// la declaro
float var1=0;

// programa principal
main
{

var1=3;
....
salida(var1,var2....);
}

Su valor deberia modificarse por la funcion() para el resto del programa  no me equivoco. ¿es asi?
¿ y si el valor es una variable local de dicha funcion cuando se ejecuta de forma ciclica se guarda el valor en memoria despues de cada ejecucion de la funcion y cuando vuelve a ejcutarse esta instancia de dicha funcion su valor ha permanecido en lo que la funcion lo dejo?

ejemplo de lo que digo:
funcion(float var1,float var2...)
{
var1= (var1+3);
}
main
{
while(){
         funcion(var1,3...);
        funcion(var5,4....);
         }
}
¿l primer ciclo del while var1 sera 3  siguiente sera 6.... y var5 hara lo mismo?

¿tra duda que pasa si divido una signed int32 entre una int? ¿ue resultados me daria? ¿Siempre hay que hacer operaciones matematicas entre variables del mismo tipo?

Quizas sean conceptos muy simples pero me han dado siempre mucha guerra, si me los podeis dejar claros de una vez para siempre os estare agradecido

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Duda sobre paso de variables
« Respuesta #1 en: 31 de Octubre de 2008, 17:02:41 »
Cada vez q llamas a una funcion, esta hace una copia de los parametros de entrada y los almacena como variables locales. Cuando la funcion termina, estas variables locales son destruidas. Por lo tanto, cualquier modificacion hecha dentro de la funcion, se hace sobre la copia y no sobre la variable q le pasamos.
Si queres modificar el valor de cierta variable en una funcion, lo q se hace es pasarle a la funcion un puntero a esa variable, entonces todo lo q hagas dentro de la funcion, modificara permanentemente el valor de esa variable (que puede ser global o estar en el main u otra funcion).
Si vas a usar una variable global, no hace falta q se la pases por parametro, cualquier modificacion hecha se va a guardar y la variable no sera destruida al terminar la funcion.
En el ejemplo q pusiste, se perderia el valor, ya que le estas pasando una copia de la variable global.

Con respecto al valor q retorna la funcion, este es reemplazado por el lugar donde estaba la funcion cuando la llamaste, entonces si no lo igualas a alguna variable, el valor se pierde.
resultado=funcion(param1,param2);

Te recomiendo q leas un poco sobre funciones en C, y juga un poco con el lenguaje. Hace codigo para ver q pasa, total aca nada se rompe. Espero q te aclare tu duda, saludos!
« Última modificación: 31 de Octubre de 2008, 17:05:52 por gera »

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

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Duda sobre paso de variables
« Respuesta #2 en: 31 de Octubre de 2008, 17:11:35 »
Si me lo aclaraste solo me falta saber como pasar el puntero como parametro a la funcion

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Duda sobre paso de variables
« Respuesta #3 en: 31 de Octubre de 2008, 22:20:30 »
Te doy un ejemplo (supongo q sabes de punteros)

Código: [Seleccionar]
int suma(int a, int b, int *resultado) // el * significa q esperamos una direccion de memoria
{
   *resultado=a+b; //almacenamos la suma en la variable a la q apunta el puntero
   return 0; //devolvemos 0 para indicar que la operacion salio bien
}

int main()
{
   int a,b, resultado;
   suma(a,b,&resultado); //notese el & antes de resultado, eso indica direccion
   printf("la suma es: %d",resultado);
   return 0; //salimos sin errores
}
De esta manera no se pierde el resultado al terminar la funcion, ya que se destruye el puntero *resultado, pero no la variable a la q apuntaba, entonces el resultado queda almacenado en dicha variable.
Tambien se puede hacer con variables globales:
Código: [Seleccionar]
int resultado;
int suma(int a, int b) //no hace falta pasarle resultado ya q es global
{
   resultado=a+b;
   return 0; //devolvemos 0 para indicar que la operacion salio bien
}

int main()
{
   int a,b;
   suma(a,b);
   printf("la suma es: %d",resultado);
   return 0; //salimos sin errores
}

saludos!
« Última modificación: 31 de Octubre de 2008, 22:23:36 por gera »

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Duda sobre paso de variables
« Respuesta #4 en: 31 de Octubre de 2008, 22:39:28 »
Algec:

Te pongo una muestra con alguna de las Funciones "Útiles" en CCS C que yo uso.

Por ejemplo ésta en la que cambio un carácter por otro en un string, pasándole a la función en vez del string completo un puntero a ese string para que haga el cambio sobre la misma variable que le estoy pasando.

Código: C#
  1. /** \brief Reemplaza carácter en string null-terminated.
  2.   *
  3.   * \param c Carácter a sustituir.
  4.   * \param p Carácter nuevo a insertar.
  5.   * \param[out] pF  Puntero a string null-terminated.
  6.   *
  7.   * \return void
  8.   */
  9. void replace_char(char c, char p, char* pF){
  10.  
  11.    int8 i;
  12.    char x;
  13.  
  14.    x=pF[0];
  15.    for(i=0;i<max_len_buffer,x!='\0';i++){
  16.       x=pf[i];
  17.       if(x==c){
  18.          pF[i]=p;
  19.       }
  20.    }
  21. }
  22.  
  23. void main(void){
  24.  
  25.    char string[]="Mi string\0";
  26.  
  27.    replace_char(' ','X',&string[0]);
  28.  
  29. }

Al declarar la función escribo el parámetro como char* (indicando que es un puntero con la *) y al llamar a la función le paso como parámetro la dirección del primer elemento del array del string o sea de string[0] (indicando que es una dirección con el operador &)


Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Duda sobre paso de variables
« Respuesta #5 en: 31 de Octubre de 2008, 22:57:49 »
Muy bueno redpic. Los strings son lo mejor para aprender punteros en C. Recuerdo q mi profe nos hizo escribir toda la libreria string.h desde 0 para practicar ;)
Solo una cosita, en donde pusiste
char string[]="Mi string\0";
no hace falta el \0, ya que cuando pones algo entre comillas, el compilador agrega automaticamente el caracter nulo al final ;)
saludos!!

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Duda sobre paso de variables: Punteros, strings y otras cosas curiosas
« Respuesta #6 en: 31 de Octubre de 2008, 23:12:22 »
Muy cierto, Gera, lo del '\0', no hace falta, así "Mi string" ocupa realmente 10 caracteres, los nueve entrecomillados y el décimo que es el '\0' del compilador. Gracias por la nota aclaratoria.

Otro detalle curioso:

Al llamar a la función replace_char(' ','X',&string[0]); tal como aparece en el ejemplo produciría como resultado que string pasaría a contener "MiXstring\0"

Imaginemos que partimos de nuevo del contenido "Mi string\0" y sustituimos la íes por equis con char('i','X',&string[0]); el nuevo contenido sería  "Mx strXng\0"

Mas, pero, sin embargo si la llamada la realizásemos de la forma char('i','X',&string[3]); (notad que ahora paso la dirección del cuarto elemento del string) el resultado sería "Mi strXng\0"

Esto es así ya que jugamos con que el puntero que pasamos, y que es lo que espera nuestra función, no es realmente el puntero a un string, sino el puntero a un carácter char* que será el del string completo si la dirección que contiene coincide con la del primer carácter del string, o sea string[0], pero que como hemos visto podemos utilizar para apuntar a cualquier parte dentro de él.

Todo esto pasa por el concepto de que realmente un string comienza con la dirección del primer elemento string[0] y acaba cuando encontremos el valor '\0' en string[n]  :mrgreen:
 
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Duda sobre paso de variables
« Respuesta #7 en: 01 de Noviembre de 2008, 00:43:21 »
Exacto, y ya q estamos hablando de strings. Es exactamente lo mismo &string[0], que solamente string. Ya que un array no es mas q un puntero al primer elemento del mismo ;)
Por eso todas las funciones q impliquen strings piden como argumento un puntero a char, y nosotros le ponemos directamente el nombre del array.
saludos!

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

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Duda sobre paso de variables
« Respuesta #8 en: 01 de Noviembre de 2008, 06:44:01 »
Mil gracias, me quedo clarisimo.
Tambien he visto que si declaro las variables como static permanece el valor, si las declaro globales al salir de la funcion que las usa el valor se mantiene y si lo hago en la funcion tambien pero solo para esa funcion.
Pero....una consulta mas, como puedo pasarle a una funcion un PIN, es decir si quiero tener una funcion que seria de este tipo
void funcion(PIN_A1,PIN_2); por ejemplo
¿ esto ultimo es posible?
Todo es para hacer una funcion estandar de libreria a la que llamar solo dandole los parametros que me interese.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Duda sobre paso de variables
« Respuesta #9 en: 01 de Noviembre de 2008, 21:12:19 »
No hace falta pasarle el estado de los pines a la funcion. Podes chequear el mismo desde dentro de la misma con la funcion INPUT(pin)
saludos!

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

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
Re: Duda sobre paso de variables
« Respuesta #10 en: 02 de Noviembre de 2008, 07:07:14 »
No es eso, lo que quiero es hacer una funcion estandar que yo llame con una linea del tipo
funcion(...,PIN QUE QUIERO USAR EN ESTA FUNCION,...);
es decir quiero que mi funcion funcion() use ese pin en esta instancia a la que llamo y en la siguiente linea de mi main poder usar otra igual con otro PIN

main(){
funcion(..PIN_B1,...); // usaria el PIN_B1 para por ejemplo una salida
funcion(..PIN_B5,...);
}


Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Duda sobre paso de variables
« Respuesta #11 en: 02 de Noviembre de 2008, 12:57:38 »
Es facil. Cada puerto del pic es un registro q tiene su direccion en memoria (leer hoja de datos). Entonces basta con pasar por parametro a la funcion esa direccion y el numero de pin (puede ser en forma de int). Luego en tu funcion trabajas sobre esa direccion de memoria.
Para hacerlo mas facil podes usar las directivas #byte y #bit.
saludos!!!

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