elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar parametro a procedimiento
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pasar parametro a procedimiento  (Leído 2,730 veces)
soyloqbuskas

Desconectado Desconectado

Mensajes: 219


¡El conocimiento es de todos!


Ver Perfil
Pasar parametro a procedimiento
« 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.


« Última modificación: 20 Octubre 2015, 12:03 pm por soyloqbuskas » En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Pasar parametro a procedimiento
« Respuesta #1 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. }


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Pasar parametro a procedimiento
« Respuesta #2 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!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
soyloqbuskas

Desconectado Desconectado

Mensajes: 219


¡El conocimiento es de todos!


Ver Perfil
Re: Pasar parametro a procedimiento
« Respuesta #3 en: 23 Octubre 2015, 06:24 am »

Muchas gracias!! ya lo tengo arreglado.

Un saludo.
En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
COMO PASAR PARAMETRO DE CRYSTAL REPORTS A VB 6
Programación Visual Basic
danieline 0 4,398 Último mensaje 26 Octubre 2005, 18:07 pm
por danieline
[SOLUCIONADO] Pasar array como parámetro.
Java
NetJava 3 23,213 Último mensaje 15 Febrero 2011, 21:55 pm
por Debci
Pasar 'this' como parametro
Programación C/C++
DvNe 6 3,496 Último mensaje 3 Abril 2014, 23:48 pm
por DvNe
PHP OO Pasar un parametro o variable a una clase « 1 2 3 »
PHP
Slikp 21 8,803 Último mensaje 6 Noviembre 2014, 18:29 pm
por T. Collins
[C] Pasar array como parametro a un "procedimiento" (void)
Programación C/C++
n-utz 3 2,984 Último mensaje 11 Junio 2016, 23:44 pm
por AlbertoBSD
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines