SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: JPVM en Viernes 27 de Mayo de 2005, 07:44

Título: Convierte A Diferente Base
Publicado por: JPVM en Viernes 27 de Mayo de 2005, 07:44
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.  
Título: Re: Convierte A Diferente Base
Publicado por: carmamezo en Viernes 27 de Mayo de 2005, 08:34
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:
Título: Re: Convierte A Diferente Base
Publicado por: carmamezo en Viernes 27 de Mayo de 2005, 08:36
Perdon, en el primer código se me olvidó poner el static delante de char ret[1000]:
static char ret[1000];

 :D
Título: Re: Convierte A Diferente Base
Publicado por: JPVM en Viernes 27 de Mayo de 2005, 18:30
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
Título: Re: Convierte A Diferente Base
Publicado por: pmike en Viernes 27 de Mayo de 2005, 19:55
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
Título: Re: Convierte A Diferente Base
Publicado por: pmike en Viernes 27 de Mayo de 2005, 22:48
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;
}
Título: Re: Convierte A Diferente Base
Publicado por: JPVM en Sábado 28 de Mayo de 2005, 05:00
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
Título: Re: Convierte A Diferente Base
Publicado por: pmike en Sábado 28 de Mayo de 2005, 08:53
q raro

yo lo prove y funcionaba con el codigo de arriba

miralo mejor
Título: Re: Convierte A Diferente Base
Publicado por: JPVM en Sábado 28 de Mayo de 2005, 16:54
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