[C] pase de parametros

Iniciado por J.cE, 25 Febrero 2014, 19:47 PM

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

J.cE

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

Gh057

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!
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...

amchacon

No es correcto, debe ser:

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


n ya es un puntero, no necesitas coger su dirreción.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Yoel Alejandro

#3
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 (cpp) [Seleccionar]

#include<stdio.h>
typedef struct
{
 int x;
}numero;


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 (cpp) [Seleccionar]

void uno (numero *n_ptr);
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 (cpp) [Seleccionar]

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

void uno (numero *n_ptr)
{
  dos (n_ptr);    // se pasa una copia del puntero a "dos"
}

void dos (numero *n_ptr)
{
   (*nptr).x += 1;
}


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 (cpp) [Seleccionar]

#include<stdio.h>

typedef struct
{
 int x;
}numero;

void uno (numero *n_ptr);
void dos (numero *n_ptr);

main()
{
 numero n;
 n.x = 3;
 printf ("antes n.x era: %d\n", n.x);
 uno (&n);
 printf ("ahora n.x es: %d\n", n.x);
}

void uno (numero *n_ptr)
{
  dos (n_ptr);    // se pasa una copia del puntero a "dos"
}

void dos (numero *n_ptr)
{
   (*n_ptr).x += 1;
}

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

amchacon

¿Para que creas una estructura? :huh:

Puedes hacerlo directamente:
Código (cpp) [Seleccionar]
typedef int Numero;
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Yoel Alejandro

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
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)