Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: J.cE en 25 Febrero 2014, 19:47 pm



Título: [C] pase de parametros
Publicado por: J.cE en 25 Febrero 2014, 19:47 pm
como estan amigo, mi pregunta es como se hace el pase de parametros a un procedimento dentro de otro procedimento, ejm:

#include<stdio.h>
typedef struct
{
  int n;
}numero;
void uno(numero *n);
void dos(numero *n);

main()
{
  numero n;
  uno(&n);
}

void uno(numero *n)
{
   dos(&n);//aqui es la duda no se si eso sea correcto


Título: Re: [C] pase de parametros
Publicado por: Gh057 en 25 Febrero 2014, 22:07 pm
hola J.cE , debes leer sobre las dos posibilidades de pasaje de parámetros a una función, pueden ser por valor o por referencia. entendiendo eso sabrás cuando debes pasar una variable (cantidad de "algo") para operar con ella, o un puntero (dirección de memoria donde se guarda ese "algo") para operar, y modificarlo:

-> https://www.google.com.ar/?gws_rd=cr&ei=D9haUrrXC8bLkQfp3oCYAQ#q=pasaje+de+parametros+por+valor+y+referencia+

luego que domines su uso en funciones básicas, puedes seguir con los tda (tipos de dato abstracto, donde se inicia con las estructuras, luego pilas, colas, el concepto de nodo, listas, árboles...)


->http://es.wikipedia.org/wiki/Tipo_de_dato_abstracto

que es el inicio del paradigma POO... pero hay que ir paso a paso. saludos!


Título: Re: [C] pase de parametros
Publicado por: amchacon en 25 Febrero 2014, 23:36 pm
No es correcto, debe ser:

Código
  1. void uno(numero *n)
  2. {
  3.   dos(n);//aqui es la duda no se si eso sea correcto
  4. }  

n ya es un puntero, no necesitas coger su dirreción.


Título: Re: [C] pase de parametros
Publicado por: Yoel Alejandro en 1 Marzo 2014, 16:17 pm
Hola, supongo que tu intención es que la función "uno" tome su parámetro y se lo pase a la función "dos". En ese caso, me voy a tomar la libertar de cambiar el nombre del miembro entero de la estructura numero de "n" a "x". Pues tienes un uso duplicado de nombres que si bien no es un error, puede resultar confuso. Así quedaría:

Código
  1. #include<stdio.h>
  2. typedef struct
  3. {
  4.  int x;
  5. }numero;
  6.  

También te aconsejaría que cuando el argumento se refiera a un puntero, uses un sufijo distintivo como "Ptr", o "_ptr". Quedaría entonces:

Código
  1. void uno (numero *n_ptr);
  2. void dos (numero *n_ptr);

Ahora vamos al centro del problema. En C todos los argumentos de las funciones se pasan por valor. Es decir, se pasa como argumento de la función una copia del valor de la variable. Pero se puede simular el paso por referencia, dando como argumento la dirección de la variable en cuestión (ésto eso, se pasa un puntero a dicha variable). Lo cual permite alterar directamente la variable al manipular en el área de memoria ocupada por ésta. Sólo ten en cuenta que en el código de la función debes usar el operador de indirección "*" para acceder al contenido de la variable, apuntado por la dirección suministrada.

Por ejemplo, supongamos que "uno" pasa el valor de su argumento (un puntero) a "dos", la cual modifica el valor del campo x de la estructura referenciada. Entonces sería

Código
  1. main()
  2. {
  3.  numero n;
  4.  uno(&n);
  5. }
  6.  
  7. void uno (numero *n_ptr)
  8. {
  9.   dos (n_ptr);    // se pasa una copia del puntero a "dos"
  10. }
  11.  
  12. void dos (numero *n_ptr)
  13. {
  14.    (*nptr).x += 1;
  15. }

Observa que en el código de "dos" se accede al contenido apuntado por n_ptr (el contenido de la variable n) por medio de (*n_ptr). Se requieren los paréntesis porque el operador "." tiene mayor prioridad que el "*", y de no colocarlos se interpretaría *(n_ptr.x) que es incorrecto pues n_ptr es un apuntador y no una estructura.

Por último, aquí puedes ver el código completo y al compilar y ejecutar verás que aunque hemos puesto inicialmente el valor de n.x en 3, al final termina siendo 4  :D

Código
  1. #include<stdio.h>
  2.  
  3. typedef struct
  4. {
  5.  int x;
  6. }numero;
  7.  
  8. void uno (numero *n_ptr);
  9. void dos (numero *n_ptr);
  10.  
  11. main()
  12. {
  13.  numero n;
  14.  n.x = 3;
  15.  printf ("antes n.x era: %d\n", n.x);
  16.  uno (&n);
  17.  printf ("ahora n.x es: %d\n", n.x);
  18. }
  19.  
  20. void uno (numero *n_ptr)
  21. {
  22.   dos (n_ptr);    // se pasa una copia del puntero a "dos"
  23. }
  24.  
  25. void dos (numero *n_ptr)
  26. {
  27.    (*n_ptr).x += 1;
  28. }


Título: Re: [C] pase de parametros
Publicado por: amchacon en 2 Marzo 2014, 15:54 pm
¿Para que creas una estructura? :huh:

Puedes hacerlo directamente:
Código
  1. typedef int Numero;


Título: Re: [C] pase de parametros
Publicado por: Yoel Alejandro en 2 Marzo 2014, 20:56 pm
Jeje, bueno yo no se por qué el autor del post usó una estructura (aunque sinceramente me pareció algo complicado), sólo traté de aclarar la duda planteada respetando hasta lo posible la integridad del tema original  :D