Programación General > C/C++

 No logro regresar el resultado en llamado a función

(1/1)

LenguajeC:
Hola a todos.-
Como este es mi primer post voy a presentarme porque mi situación es un tanto particular.-
Tengo 58 años y por mi trabajo y por distar 90 km. de la universidad mas cercana no tengo otra manera que leer,leer y consultar en los foros.-
Bueno, a continuación les dejo mi primer problema para ver si me dan una mano con la solución y me dicen en que debo mejorar el programa.-


--- Código: C ---#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <conio.h> HANDLE consola;COORD posicion; void dlq(int hor, int ver);void ejemplos();double separa(char ingreso[], double *resultado);double *opciones(double memoria, double resultado); int main(int argc, char *argv[]){   consola = GetStdHandle(STD_OUTPUT_HANDLE);   system("color 9E");   ejemplos();   double resultado,memoria=0;   char ingreso[50];   while (ingreso[0] != 's')   {      system("cls");      ejemplos();      dlq(20,4);printf(" Ingreso....:                      s - para finalizar");      dlq(18,51);printf("%5.3f",memoria);      dlq(20,18);      gets(ingreso);      if(ingreso[0] !='0')      {         separa(ingreso,&resultado);         if(resultado !=0)         {            dlq(18,17);            printf("%5.3f",resultado);            opciones(memoria,resultado);            ingreso[0]='';         }      }      else      {         system("color C1");         dlq(24,5);         printf("Ingreso incorrecto - por favor revise los ejemplos");         dlq(26,5);         system("pause");         system("color 9E");         dlq(26,5);      }   }      return 0;} void dlq(int hor, int ver){   posicion.X = ver;posicion.Y = hor;SetConsoleCursorPosition(consola, posicion);} double separa(char ingreso[], double *resultado){   char opUno[50], oper[50], opDos[50], priseg=65;   int i=0, poper=0, pseg=0;   for(i = 0; i < strlen(ingreso); i++)    {      if((ingreso[i] == 42 || ingreso[i] == 43 || ingreso[i] == 45 || ingreso[i] == 47))      {         oper[poper]=ingreso[i];         oper[poper+1]= '';         poper++;         priseg=priseg+1;      }      else         {            if(priseg == 65)         {            opUno[i] = ingreso[i];            opUno[i+1] = '';         }         else         {            opDos[pseg] = ingreso[i];            opDos[pseg+1] = '';            pseg++;         }      }   }   char op_1[50], op_2[50];   int lugar = 0;   for(i=0;opUno[i]!='';i++)     {      if((opUno[i] > 47 && opUno[i] < 58) || (opUno[i] == 46))            {          op_1[lugar] = opUno[i];                   lugar++;         op_1[lugar] = '';      }   }   lugar = 0;   for(i=0;opDos[i]!='';i++)     {      if((opDos[i] > 47 && opDos[i] < 58) || (opDos[i] == 46))            {         op_2[lugar] = opDos[i];         lugar++;         op_2[lugar] = '';      }   }   if(strlen(opUno) ==  strlen(op_1) && strlen(opDos) ==  strlen(op_2) && strlen(oper) == 1)   {       double op_uno=0,op_dos=0;       op_uno=atof(op_1);op_dos=atof(op_2);         if(oper[0] == '+')          *resultado = op_uno + op_dos;       if(oper[0] == '-')          *resultado = op_uno - op_dos;       if(oper[0] == '*')          *resultado = op_uno * op_dos;       if(oper[0] == '/')          *resultado = op_uno / op_dos;   }   else   {      *resultado = 0;   }      return (*resultado);} void ejemplos(){   dlq(2,4);   printf(" ---------------------- Calculadora lineal ----------------------");   dlq(4,4);printf(" Ejemplos:");   dlq(6,13);printf(" Suma...........: 125.4+18");   dlq(8,13);printf(" Resta..........: 125-10.54");   dlq(10,13);printf(" MultiplicacixA2n.: 125.48*10.50");   dlq(12,13);printf(" DivicixA2n.......: 678.48/5.99");   dlq(14,13);printf(" No dejar espacios - x3C Enter x3E confirma");   dlq(16,4);   printf(" ----------------------------------------------------------------");   dlq(18,4);printf(" Resultado..:                      Memoria....:");}  double *opciones(double memoria,double resultado){   dlq(22,5);   printf("----------------------------------------------------------------");   dlq(24,5);   printf("Opciones de memoria");   dlq(26,5);   printf("1 - Menoria +");   dlq(28,5);       printf("2 - Menoria -");   dlq(30,5);    printf("3 - Borra memoria y memoria +");   dlq(32,5);    printf("4 - Borra memoria y memoria -");   dlq(34,5);    printf("5 - Sin ingerencia en memoria");   int opc=0;   while (opc <1 || opc > 5)   {      dlq(36,5);       printf("Ingreso...:");      scanf("%d",&opc);         dlq(38,5);      switch(opc)      {         case 1:memoria = memoria + resultado;break;         case 2:memoria = memoria - resultado;break;         case 3:memoria = resultado;break;         case 4:memoria = - resultado;break;         case 5:break;         default:printf("Solo numeros del 1 al 5, apriete una tecla para continuar...");getch();      }   }   return &memoria;} 
Un gran saludo.-
Daniel
Nota:Lenguaje C - Windows XP - DEV-C++.-

vite666:
y cual es su problema?

LenguajeC:
Hola vite666
Perdón que torpe, mil disculpas.-
El problema es que no logro regresar la variable "memoria" a la función main con el contenido que obtengo de la llamada "opciones(memoria,resultado);".-

Espero que ahora se entienda.-

Saludos.
Daniel

Epa:
Buenas.

Por un lado, en el llamado a funcion no estas asignando el valor de retorno a ninguna variable..

Por otro lado, la funcion devuelve un puntero a double, y estas devolviendo un putero a "memoria", lo que es una variable local a la funcion y cuando se sale de esta, esa memoria deja de estar reservada. El compilador deberia tirarte un warning en la linea del return.

Si la idea es registrar los cambios en la variable, podes hacer las siguientes modificaciones:

definir la funcion:
double opciones(double memoria,double resultado);
y hacer al llamado:
mamoria = opciones(memoria, resultado);

o
definir la funcion:
void opciones(double *memoria,double resultado);
y hacer el llamado a funcion:
opciones(&memoria, resultado);

para esta ultima hace falta cambiar el cuerpo de la funcion para que memoria sea tratada como un puntero.

Espero que sirva.
Saludos

LenguajeC:
Hola Epa
Gracias por tu respuesta, voy a poner en práctica lo que me dices, solo que lo voy a hacer sin puntero porque estoy muy al principio y quiero ir despacio.-

Saludos.
Daniel

Navegación

[0] Índice de Mensajes

Ir a la versión completa