Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: soyloqbuskas en 20 Octubre 2015, 12:02 pm



Título: Pasar parametro a procedimiento
Publicado por: soyloqbuskas en 20 Octubre 2015, 12:02 pm
¡Buenas a todos!

¿Porque esto no imprime un 5 en la salida?

Código
  1. #include <stdio.h>
  2.  
  3. void funcion1(int numero1){
  4.   numero1=5;
  5. }
  6.  
  7. int main(){
  8.   int numero1=0;
  9.   funcion1(numero1);
  10.   printf("%d\n",numero1);
  11.   return 0;
  12.  
  13. }

Se que esto se podria hacer muy bien con una funcion...pero es que esto lo quiero hacer con un procedimiento mas grande y no se porque esto no funciona...¿como lo deberia escribir para que funcionase usando un void?

¿alguna idea?

gracias.


Título: Re: Pasar parametro a procedimiento
Publicado por: engel lex en 20 Octubre 2015, 12:54 pm
tienes que pasar el numero como referencia, es decir, así, se está creando una nueva variable "numero1" copia dentro del scope de la funcion1... tienes que pedir la referencia a numero1 para que funcion1 pueda alterarlo

solo necesitas un cambio, mira la declaración de la funcion

Código
  1. #include <stdio.h>
  2.  
  3. void funcion1(int &numero1){
  4.   numero1=5;
  5. }
  6.  
  7. int main(){
  8.   int numero1=0;
  9.   funcion1(numero1);
  10.   printf("%d\n",numero1);
  11.   return 0;
  12.  
  13. }


Título: Re: Pasar parametro a procedimiento
Publicado por: do-while en 20 Octubre 2015, 14:21 pm
¡Buenas!

Lo anterior solo funciona en C++.

Si quieres modificar un parámetro en C tienes que utilizar punteros (también funciona en C++, pero como ya han dicho ahí tienes referencias a variables).

Por si no sabes lo que es un puntero, es un tipo de variable que almacena una dirección de memoria.
Por ejemplo:
Código
  1. int x=5;
  2. int *ptr_x;
  3.  
  4. ptr_x = &x;
  5.  

Imagina la siguiente situación en tu RAM:

Código:
x                         ptr_x
7    8    9    10    ...  103  104  105  106
----|----|----|----| ... |----|----|----|----|
    |    |    |    | ... |    |    |    |    |
----|----|----|----| ... |----|----|----|----|

En este caso tenemos que la variable x empieza en la posición de memoria 7 y ptr_x empieza en la posición de memoria 103 (la RAM es como un conjunto de "apartamentos" de variables en el que cada una tiene su dirección, el nombre de una variable es una forma de no tener que estar recordando todo el tiempo donde se han almacenado los datos)

En el código anterior tenemos dos variables, una de ellas un entero x, y otra de tipo puntero a entero ptr_x. El puntero se declara utilizando un asterisco. En la asignación ptr_x = &x aparece otro operador relacionado con punteros y direcciones de memoria &. Este operador devuelve la dirección de memoria de la variable con la que se utiliza, en este caso estamos obteniendo la dirección de la variable x y la estamos guardando en ptr_x. Asi que el código anterior nos daría el siguiente resultado:
Código:
x                         ptr_x
7    8    9    10    ...  103  104  105  106
----|----|----|----| ... |----|----|----|----|
   0|   0|   0|   5| ... |   0|   0|   0|   7|
----|----|----|----| ... |----|----|----|----|

Y ahora entra el juego el último operador relacionado con los punteros, de nuevo el asterisco. Cuando se utiliza un asterisco con un puntero en cualquier parte del código que no se una declaración, lo que se hace es decirle al programa que trabaje con la variable que está en la dirección de memoria contenida en el puntero. Por ejemplo:
Código
  1. *ptr_x = 15
  2.  
Ahí le estamos diciendo al programa que coja la variable que está en la dirección de memoria contenida en en el valor de ptr_x y le asigne el valor 15. En este caso toma la variable que está en la posición de memoria 7 (que corresponde a x porque a ptr_x le hemos asignado la posición en la RAM de la variable x) y le asigna el valor 15, con lo que la RAM quedaría:
Código:
x                         ptr_x
7    8    9    10    ...  103  104  105  106
----|----|----|----| ... |----|----|----|----|
   0|   0|   0|  15| ... |   0|   0|   0|   7|
----|----|----|----| ... |----|----|----|----|

Ahora viene la solución a tu problema.

Cuando se pasan parámetros a funciones en C (y C++ salvo que utilices referencias) siempre se utiliza el paso por valor, lo que quiere decir que nunca se pasan las variables en si sino copias de estas, así si modificas un parámetro dentro de una función lo que modificas es la copia, no la variable que has utilizado en la llamada. Para poder modificar variables exteriores a una función tienes que utilizar punteros, así dentro de una función siempre sabrás que posición de memoria ocupa una variable exterior y podrás modificarla con el operador asterisco (técnicamente el operador de indirección).

Así tu código quedaría:
Código
  1.    #include <stdio.h>
  2.  
  3.    void funcion1(int *numero1){
  4.       (*numero1)=5;
  5.    }
  6.  
  7.    int main(){
  8.       int numero1=0;
  9.       funcion1(&numero1);
  10.       printf("%d\n",numero1);
  11.       return 0;
  12.  
  13.    }
  14.  

Como puedes ver, en la línea 3 estamos diciendo que la funcion1 recibe como parámetro un puntero a entero, y en la línea 9 de main estamos pasando la dirección de memoria de numero1 a la función.

En la línea 4, dentro de la función, estamos aplicando el operador de indirección al puntero numero1 para trabajar con la variable que está en la posición de memoria a la que apunta, en este caso la variable numero1 que está en main, y le estamos asignando el valor 5.

Espero que te haya quedado claro.

¡Saludos!


Título: Re: Pasar parametro a procedimiento
Publicado por: soyloqbuskas en 23 Octubre 2015, 06:24 am
Muchas gracias!! ya lo tengo arreglado.

Un saludo.