Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: javiherro en 30 Septiembre 2013, 12:14 pm



Título: Duda funciones C++
Publicado por: javiherro en 30 Septiembre 2013, 12:14 pm
Hola, estoy un poco perdido, asi que a ver si alguien me puede ayudar.

Mi problema es que no sé si una función que a su vez llama a otra, puede usar variables creadas y guardadas dentro de esta segunda.

Me explico: me han pedido reescribir una función (realmente tengo que dividirla en 3).

La función original es una cosa asi:

static double CalculaPrecioContrato(contrato){
(saco la info del contrato porque hay que tratarla primero):
int param A = contrato.dameA;
int param B = contrato.dameB;
int param C = contrato.dameC;

(es necesario tratar un par de datos antes de calcular el precio)
modifico A;
modifico B;

(con todos los datos calculo el precio)
código que calcula el precio del contrato
}

Bien, digamos que a grandes rasgos este es el código.

Me han pedido que lo divida en 3 métodos (uno que extraiga datos del contrato, otro que modifique los datos y otro que calcule el precio), para que quedara algo como:

static double CalculaPrecioContrato(contrato){
extraeInfo(contrato);
modificaDatos(contrato);
calculaPrecio(contrato);
}

Estas 3 funciones estarían declaradas antes...¿no?

Ahora mi duda es, si yo hago el método para extraer datos, algo asi:

static void extraerInfo(contrato){
int param A = contrato.dameA;
int param B = contrato.dameB;
int param C = contrato.dameC;
}

Los valores de paramA, paramB, y paramC, ¿se pueden usar luego dentro de la función "general" CalculaPrecioContrato o de la función modificaDatos?

Si es que no, ¿cómo podría hacerlo?

Gracias de antemano por la ayuda.

Saludos,


Título: Re: Duda funciones C++
Publicado por: eferion en 30 Septiembre 2013, 13:00 pm
Usa las etiquetas GeSHi para que el código sea más legible.

Código
  1. static double CalculaPrecioContrato(contrato){
  2. extraeInfo(contrato);
  3. modificaDatos(contrato);
  4. calculaPrecio(contrato);
  5. }

Estas 3 funciones estarían declaradas antes...¿no?

Efectivamente, una función no puede ser llamada si no se ha declarado y/o implementado previamente.

Es por eso que las cabeceras de las aplicaciones escritas en c están plagadas de declaraciones de funciones.

Ahora mi duda es, si yo hago el método para extraer datos, algo asi:

Código
  1. static void extraerInfo(contrato){
  2. int param A = contrato.dameA;
  3. int param B = contrato.dameB;
  4. int param C = contrato.dameC;
  5. }

Los valores de paramA, paramB, y paramC, ¿se pueden usar luego dentro de la función "general" CalculaPrecioContrato o de la función modificaDatos?

Si es que no, ¿cómo podría hacerlo?

Una aclaración previa, int param A está mal o bien pones int paramA o bien param A ( depende de si param es un tipo o es parte del nombre. El nombre de una variable no puede incluir espacios.

Y respondiendo a tu pregunta, paramA, paramB y paramC puedes usarlas en extraerInfo, pero no fuera de dicha función. Si necesitas usarlas en la función que ha llamado a extraerInfo tienes que idear un mecanismo que permita que los valores almacenados en estas variables pueda llegar a la función "padre".

Una posibilidad, dado que es más de un valor lo que tienes que devolver, es usar una estructura que agrupe todos los valores y hacer un return sobre dicha estructura:

Código
  1. struct params
  2. {
  3.  int paramA;
  4.  int paramB;
  5.  int paramC;
  6. };
  7.  
  8. static struct params extraerInfo(contrato){
  9.  struct params parametros;
  10.  parametros.paramA = contrato.dameA;
  11.  parametros.paramB = contrato.dameB;
  12.  parametros.paramC = contrato.dameC;
  13.  
  14.  return parametros;
  15. }

Otra opción es que extraerInfo requiera el paso de 3 punteros para poder almacenar en dichos punteros los valores devueltos por las tres funciones:

Código
  1. void extraerInfo( contrato, int* paramA, int* paramB, int* paramC )
  2. {
  3.  *paramA = contrato.dameA;
  4.  *paramB = contrato.dameB;
  5.  *paramC = contrato.dameC;
  6. }
  7.  
  8. void funcionQueLlamaAExtraerInfo( contrato )
  9. {
  10.  int paramA, paramB, paramC;
  11.  
  12.  extraerInfo( contrato, &paramA, &paramB, &paramC );
  13. }

Notas finales:

* No es necesario declarar static a las funciones de C. Ponerles ese modificador permite que haya funciones con el mismo nombre en distintos archivos... pero eso te puede generar otros problemas si no controlas el tema, así que mejor quita ese modificador.

* El código de los ejemplos no va a compilar porque "contrato" no se de qué tipo es: tipo básico, estructura, puntero