Cita de: 85
antes de hacer una implementación lo primero es saber como funciona realmente la original.. en base a esto es que decidí arreglar estas funciones siguiendo la misma lógica de construcción, que por cierto es una que suelo usar seguido.
Empezando por ATOI
En mi primer mensaje publique el comportamiento de esa funcion, un consejo para reducir las expresiones en tus programas y dos ejemplos. ¿La intencion de estos ultimos? Tener a la vista el codigo fuente de otros realizando la misma operacion, a partir de ahi ya tienes un punto de referencia.Empezando por ATOI
Acabas de publicar dos nuevas versiones de los programas con un comentario que, para decirlo de una forma amable, preocupa:
Cita de: 85
SE AGREGARON VERSIONES MEJORADAS PARA NO HACER USO DE TABLAS, NI DE FUNCIONES INNECESARIAS COMO LOG, POW, STRLEN, de CTYPE, de STRING, etc SIN ASIGNACIONES DINÁMICAS, y USANDO MACROS PARA HACER EL CÓDIGO MÁS LEGIBLE
Si la intencion es desarrollar funciones propias con el mismo comportamiento que atoi (estandar) e itoa (extension) me temo que en el caso de la primera esta continua lejos del comportamiento indicado.Esto lo puedes comprobar imprimiendo el resultado de atoi y tu version de ella, por ejemplo:
Código
Y al utilizar un array que para empezar no es necesario complicas las expresiones, un ejemplo de ello se da si la cadena a procesar es "0", la sentencia:
Código
Resulta en:
return tab1[((int)str[0]-48)-1];
Código
return tab1[-1];
Hay que eliminar el uso del array, de las macros y usar expresiones mejores, en el sentido de ser mas claras y con un minino de subexpresiones. Por ejemplo al expandirse una macro terminas con la expresion:
Código
Innecesariamente larga ya que se puede sustituir por:
val1 = tab1[(int)(str[i]=='0' ? 9:(((int)str[i]-48)-1))]
Código
val1 = str[i] - '0'
Por ultimo en el caso de las macros no entiendo porque piensas que hacen el codigo fuente mas legible cuando el efecto es el opuesto.
----
En cuanto a la funcion atoi los problemas aqui son un poco mas complejos. Para empezar las sentencias de retorno (salvo la ultima) estan demas debido a los condicionales.
Tambien debes analizar los dos bloques principales ya que salvo las dos operaciones en el caso de un numero negativo (almacenar el signo en la cadena y cambiarlo a positivo) son identicos. Aqui las dos opciones son restructurar la funcion para tener un solo bloque o bien crear una funcion.
Y como en el caso de la primera funcion hay que eliminar las macros.
Un saludo