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)
| | |-+  Duda funciones C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda funciones C++  (Leído 1,624 veces)
javiherro

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Duda funciones C++
« 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,


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda funciones C++
« Respuesta #1 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


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con Funciones.
Programación C/C++
freecom4ever 3 2,510 Último mensaje 14 Marzo 2012, 19:52 pm
por Eternal Idol
funciones duda
Programación C/C++
ALONSOQ 5 3,022 Último mensaje 27 Julio 2012, 17:23 pm
por rir3760
Duda con funciones en C.
Programación C/C++
Danirs 6 3,573 Último mensaje 24 Octubre 2012, 02:21 am
por rir3760
[Duda] Funciones
Programación C/C++
Zodiak98 5 2,525 Último mensaje 12 Julio 2013, 09:21 am
por eferion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines