• Miércoles 18 de Diciembre de 2024, 11:36

Autor Tema:  Convierte A Diferente Base  (Leído 2866 veces)

JPVM

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Convierte A Diferente Base
« en: Viernes 27 de Mayo de 2005, 07:44 »
0
Me podrian ayudar a decirme que esta fallando

Código: Text
  1.  
  2. #define TEST
  3.  
  4. #include <stdlib.h>
  5. #ifdef TEST
  6. #include <stdio.h>
  7. #endif
  8.  
  9.  
  10.  
  11.  char *base_convert(const char *in, char *out, int rin, int rout)
  12.  {
  13.        long n;
  14.        char *dummy;
  15.  
  16.        n = strtol(in, &dummy, rin);
  17.        return itoa(n, out, rout);
  18.        
  19.  }
  20.  
  21. #ifdef TEST
  22.  
  23.  int main(int argc, char *argv[])
  24.  {
  25.        int rin, rout;
  26.        char buf[40];
  27.  
  28.        if (4 > argc)
  29.        {
  30.              puts("Usa: BASCNVRT <numero> <base_in> <base_out>");
  31.              return(-1);
  32.        }
  33.        rin  = atoi(argv[2]);
  34.        rout = atoi(argv[3]);
  35.        printf("%s (base %d) = %s (base %d)\n", argv[1], rin,
  36.              base_convert((const char *)argv[1], buf, rin, rout), rout);
  37.              
  38.        return 0;
  39.      
  40.  }
  41.  
  42. #endif
  43.  
  44.  

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Convierte A Diferente Base
« Respuesta #1 en: Viernes 27 de Mayo de 2005, 08:34 »
0
Hola,
creo que el problema está en la forma en la que devuelves el char* de la función, cada función tiene su propia pila y por tanto las variables de cada función pueden ser usadas y permanecen sólo durante la ejecución de esa función (a no ser que las declares de tipo static).
Cuando itoa() te devuelve un apuntador a una cadena de caracteres ésta se encuentra en la pila de la función, así que cuando la función termine la memoria que ocupa puede ser corrompida.  Para evitar esto haz lo siguiente:
Código: Text
  1.  
  2. char *base_convert(const char *in, char *out, int rin, int rout)
  3. {
  4.       long n;
  5.       char *dummy;
  6.       char ret[1000];
  7.       n = strtol(in, &dummy, rin);
  8.       ret=itoa(n, out, rout);
  9.       return(ret);      
  10. }
  11.  
  12.  

o sino puedes hacer lo siguiente:
Código: Text
  1.  
  2. void base_convert(const char *in, char *out, int rin, int rout,char *ret)
  3. {
  4.       long n;
  5.       char *dummy;
  6.      
  7.       n = strtol(in, &dummy, rin);
  8.       ret=(char*)malloc(n*sizeof(char));
  9.       ret=itoa(n, out, rout);
  10. }
  11.  
  12. int main ()
  13. {
  14.      char *vble;
  15.      ......
  16.      base_convert(.....,vble);
  17.  
  18.  
  19.  


Un saludo.  :lightsabre:
No hay tonto más molesto que el ingenioso.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Convierte A Diferente Base
« Respuesta #2 en: Viernes 27 de Mayo de 2005, 08:36 »
0
Perdon, en el primer código se me olvidó poner el static delante de char ret[1000]:
static char ret[1000];

 :D
No hay tonto más molesto que el ingenioso.

JPVM

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: Convierte A Diferente Base
« Respuesta #3 en: Viernes 27 de Mayo de 2005, 18:30 »
0
Código: Text
  1. #define TEST
  2.  
  3. #include <stdlib.h>
  4. #ifdef TEST
  5. #include <stdio.h>
  6. #endif
  7.  
  8.  
  9.  
  10. char *base_convert(const char *in, char *out, int rin, int rout)
  11. {
  12.      long n;
  13.      char *dummy;
  14.      static char ret[1000];
  15.      n = strtol(in, &dummy, rin);
  16.      ret=itoa(n, out, rout);
  17.      return(ret);      
  18. }
  19.  
  20. #ifdef TEST
  21.  
  22. int main(int argc, char *argv[])
  23. {
  24.       int rin, rout;
  25.       char buf[40];
  26.  
  27.       if (4 > argc)
  28.       {
  29.             puts("Usa: BASCNVRT <numero> <base_in> <base_out>");
  30.             return(-1);
  31.       }
  32.       rin  = atoi(argv[2]);
  33.       rout = atoi(argv[3]);
  34.       printf("%s (base %d) = %s (base %d)\n", argv[1], rin,
  35.             base_convert((const char *)argv[1], buf, rin, rout), rout);
  36.            
  37.       return 0;
  38.    
  39. }
  40.  
  41. #endif
  42.  
  43.  

ya hice los cambios que me dijistes pero me da un error en la fila
Código: Text
  1. ret=itoa(n, out, rout);
  2.  
me da este error incompatible type in assignment

pmike

  • Miembro activo
  • **
  • Mensajes: 62
    • Ver Perfil
    • http://www.autoresponder.com
Re: Convierte A Diferente Base
« Respuesta #4 en: Viernes 27 de Mayo de 2005, 19:55 »
0
me parece q es por la forma de expresion

para pasar de entero a ascii o string es de la siguiente manera

itoa(int, string(Resultado), int base);

ademas me parece que imprimes antes de llamar a la funcion y es al reves

Saludos
-------------------------------------------------------------

http://www.ebookred.com

-------------------------------------------------------------

pmike

  • Miembro activo
  • **
  • Mensajes: 62
    • Ver Perfil
    • http://www.autoresponder.com
Re: Convierte A Diferente Base
« Respuesta #5 en: Viernes 27 de Mayo de 2005, 22:48 »
0
Hola de nuevo

oye de paso te dejo el codigo mas legible
pq utilizas const para q la variable no se modifique y yo pocas veces he utilizado
Tambien he visto en los argumentos del main utilizas el argumento argv (argumento value) con una sola indireccion o puntero, yo he utilizado doble puntero.
En la llamada a la funcion he pasado los enteros 'rin' y 'rout' por referencia :hola:

Espero q te haya servido

CODE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
base_convert(char *in, char *out, int *rin, int *rout)
{
long n;
char *dummy;
char ret[256];

n = strtol(in, &dummy, *rin);
itoa(n, out, *rout);
}
//---------------------------------------------------------------------------
int main(int argc, char **argv)
{
int rin=0, rout=0;
char buf[40];

if(4 > argc)
   {
     puts("Usa: BASCNVRT <numero> <base_in> <base_out>");
     return(-1);
   }
     rin  = atoi(argv[2]);
     rout = atoi(argv[3]);
     base_convert(argv[1], buf, &rin, &rout);
     printf("\n%s (base %d) = %s (base %d)\n", argv[1], rin, buf, rout);
     return 0;
}
-------------------------------------------------------------

http://www.ebookred.com

-------------------------------------------------------------

JPVM

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: Convierte A Diferente Base
« Respuesta #6 en: Sábado 28 de Mayo de 2005, 05:00 »
0
antes me pedia el numero, luego  la base en que esta el numero y al final a la base que lo queria pasar , y me daba el resultado del numero en la nueva base  pero algo hice y ya no me pide eso

pmike

  • Miembro activo
  • **
  • Mensajes: 62
    • Ver Perfil
    • http://www.autoresponder.com
Re: Convierte A Diferente Base
« Respuesta #7 en: Sábado 28 de Mayo de 2005, 08:53 »
0
q raro

yo lo prove y funcionaba con el codigo de arriba

miralo mejor
-------------------------------------------------------------

http://www.ebookred.com

-------------------------------------------------------------

JPVM

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: Convierte A Diferente Base
« Respuesta #8 en: Sábado 28 de Mayo de 2005, 16:54 »
0
yo estoy usando el dev-c++ cuando ejecuto me sale de una ves esto puts("Usa: BASCNVRT <numero> <base_in> <base_out>"); y luego precione una tecla y se sale