Ayuda con funciones.

Iniciado por JimP, 30 Mayo 2017, 06:15 AM

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

JimP

Hola, necesito un programa que use funciones creadas por uno mismo y probé este codigo
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int numeroEntero(char op1[50],char op2[50],char op3[50],char op4[50], int min, int max){
int o;
printf("%s\n%s\n%s\n%s\n", op1,op2,op3,op4);
do{ printf("Ingrese una opcion entre %d y %d: ", min, max);
scanf("%d", &o);
} while(o>max || o <min);
return o;
}

int men(x){
int a,b,c,d;
switch (x){
case 1:
a=29;
printf("%d \n",a);
break;
case 2:
b=43;
printf("%d %d \n",a,b);
break;
case 3:
c=55;
printf("%d %d %d \n",a,b,c);
break;
case 4:
d=86;
printf("%d %d %d %d \n",a,b,c,d);
break;
}

}

int main() {
int op;
char op1[50]="1.Opcion 1";
char op2[50]="2.Opcion 2";
char op3[50]="3.Opcion 3";
char op4[50]="4.Salir";
  do{ op=numeroEntero(op1,op2,op3,op4,1,4); //llama a la funcion que valida el numero y muestra el texto con los nombres de las opciones
  men(op);                                                  //llama a la funcion que gestiona el menu
} while(op!=4);


return 0;
}



El problema es que al entrar a la opción 1 la variable a toma el valor de 29, el cual no debería cambiar, pero al entrar a las otras 3 opciones muestra que a toma el valor del número de la opción ingresada.
Por favor alguien me puede ayudar con lo que pasa en el código.

MAFUS

En la construcción switch/case el código salta a la etiqueta elegida. Por ejemplo, al elegirse la opción 3 el programa no sabe nada de la asignación de a ni de la asignación de b por tanto esos datos son indefinidos.

JimP

Es cierto, pero mi problema es que se va entrando a las opciones por orden por lo tanto la variable a, b, c se definen antes de ser imprimidas y la variable es la que cambia mientras que las demas continuan con los valores asignados

engel lex

#3
No, esto no es una función estática, cada vez que se accede a la función es una nueva instancia en memoria creada en blanco... incluso fíjate que tienes

int a,b,c,d;

Que indica que estás solicitando memoria para alojar eso

En tal caso para eso, a,b,c y D, deberían ser variables globales

Por cierto, en mem, te faltó declarar que x es de tipo int y como mem es también de tipo int, debe retornar un valor, tu compilador debe marcarte esos errores
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.

JimP

#4
Mi compilador no me marca tales errores y si me ejecuta el programa.
Este es el resultado:

1.Opcion 1
2.Opcion 2
3.Opcion 3
4.Salir
Ingrese una opcion entre 1 y 4: 1
29
1.Opcion 1
2.Opcion 2
3.Opcion 3
4.Salir
Ingrese una opcion entre 1 y 4: 2
2 43
1.Opcion 1
2.Opcion 2
3.Opcion 3
4.Salir
Ingrese una opcion entre 1 y 4: 3
3 43 55
1.Opcion 1
2.Opcion 2
3.Opcion 3
4.Salir
Ingrese una opcion entre 1 y 4: 4
4 43 55 86

--------------------------------
Process exited after 4.485 seconds with return value 0
Presione una tecla para continuar . . .


Ahí se ve como el primer número que devuelve, la variable a, siempre cambia según la opción menos la primera vez.
Y la demás variables no cambian, si no se mantienen con el valor asignado.

Cambie los errores que me dijeron y definí a las 4 variables como globales
#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int a,b,c,d;

int numeroEntero(char op1[50],char op2[50],char op3[50],char op4[50], int min, int max){
int o;
printf("%s\n%s\n%s\n%s\n", op1,op2,op3,op4);
do{ printf("Ingrese una opcion entre %d y %d: ", min, max);
scanf("%d", &o);
} while(o>max || o <min);
return o;
}

int men(int x){

switch (x){
case 1:
a=29;
printf("%d \n",a);
break;
case 2:
b=43;
printf("%d %d \n",a,b);
break;
case 3:
c=55;
printf("%d %d %d \n",a,b,c);
break;
case 4:
d=86;
printf("%d %d %d %d \n",a,b,c,d);
break;
}
return 0;
}

int main() {
int op;
char op1[50]="1.Opcion 1";
char op2[50]="2.Opcion 2";
char op3[50]="3.Opcion 3";
char op4[50]="4.Salir";
  do{ op=numeroEntero(op1,op2,op3,op4,1,4);
  men(op);
} while(op!=4);


return 0;
}


Y el código si funciona como debería. Gracias!!!
Aunque no entiendo todavía porque el compilador no me marcaba esos errores y porque el valor de las otras variables si me guardaba.

No hacer doble post

MAFUS

Estarás usando TurboC o TurboC++ de Borland o algún otro compilador pre-ansi con extensiones. Te recomiendo cambiarlo lo más pronto posible para evitarte aprender malos hábitos.

JimP

Cita de: MAFUS en 30 Mayo 2017, 15:30 PM
Estarás usando TurboC o TurboC++ de Borland o algún otro compilador pre-ansi con extensiones. Te recomiendo cambiarlo lo más pronto posible para evitarte aprender malos hábitos.
Pues estoy usando el Dev-C++ y no se por cual cambiarlo.

MAFUS

Eso es un IDE, aunque espero que no sea la versión 4.9.9.2. De todas formas mira si lo que hay en este post te funciona: https://stackoverflow.com/questions/16951376/how-to-change-mode-from-c98-mode-in-dev-c-to-a-mode-that-supports-c0x-ran

Al menos así podrás trabajar con una versión de compilador más moderna.

JimP

Bueno muchas gracias a todos.
Lo que estaba en esa página es para C++, pero básicamente si se hace los mismo solo que en lugar de -std=c++11 se pone -std=c11 sirve para C.