elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ATOI + ITOA remake
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: ATOI + ITOA remake  (Leído 10,539 veces)
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ATOI + ITOA remake
« Respuesta #10 en: 27 Febrero 2013, 04:07 am »

El tema se inicia con el objetivo:
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.

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
  1. printf("%d, %d\n",  atoi("+123"),  mi_atoi("+123"));
  2. printf("%d, %d\n", atoi(" +123"), mi_atoi(" +123"));
  3. printf("%d, %d\n", atoi("  123"), mi_atoi("  123"));

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
  1. return tab1[((int)str[0]-48)-1];
Resulta en:
Código
  1. 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
  1. val1 = tab1[(int)(str[i]=='0' ? 9:(((int)str[i]-48)-1))]
Innecesariamente larga ya que se puede sustituir por:
Código
  1. 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


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: ATOI + ITOA remake
« Respuesta #11 en: 27 Febrero 2013, 04:14 am »

Amí me preocupa que esos códigos que publicaste tengan partes parecidas a esto:
http://foro.elhacker.net/programacion_cc/atoi_itoa_personalizadas-t358459.0.html;msg1735068#msg1735068
A no ser que seas blackzero..

Mis modificaciones recientes no fueron probadas, sólamente se quitaron ciertas cosas que no son necesarias, tablas, funciones std, y otras cosas. La idea era quitar las tablas y los llamados innecesarios a funciones ajenas.
lamentable que no funcionen, si necesitás versiones funcionando usá las originales.

Otra cosa , las macros están hechas para simplificar y hacer el código más legible, entre otras cosas.. no se de qué libro aprendiste que no era así.
Todos sabemos que el código en las macros se copia adonde es invocada, no es en sí resumir código sino para simplificar el entendimiento.
No es lo mismo copiar 2 veces el código de la macro FACTORES, que poner 2 veces una sóla línea que diga FACTORES(). Me extraña que no lo entiendas porque eras el más interesado en resumir líneas de TEXTO..

Se entiende que el que usa la macro FACTORES la conoce, sabe su código, no necesita verlo repetido tantas veces. Si no entendés la macro no la uses porque en ese caso, si tenés razón, el código sería más ilegible.

Mi consejo entonces es que no uses macros que no entiendas..
Saludos.


EDITADO 1

hecha una revisión rápida del código, no estaba funcionando ni como las primeras versiones :/

atoi original ante esta situación:

"5f" o "11www"

devuelve 5 u 11

lo cual aunque parece tener sentido, mi función sólo devuelve 0
porque 11www no es 11.

para que cumpla con lo de pasar parámetros correctamente!

Por otro lado , comprueba el signo y guarda un resultado para usarse posteriormente a la hora de diferenciar entre significados y no:

Código:
int sig=0;
if((sig=str[0]=='+')||(sig=str[0]=='-'))
..

El índice que mostraste fue considerado como otra opción.
ITOA no fue mayormente revisada, sólo hice algunas pruebas generales, las que aparecen en el ENTRY. Tiene dos bloques de código bastante parecidos como muy bien notaste, y no estaría nada mal inventar algo para usar sólo un bloque de entre ambos.

Saludos

EDITADO 2

Decidí seguir tus sugerencias y quité el array y las macros.
Al mismo tiempo, ahora en MI_ITOA se usa 1 sólo bloque de procesamiento por factores.

Saludos




« Última modificación: 4 Marzo 2013, 23:34 pm por 85 » En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ATOI + ITOA remake
« Respuesta #12 en: 27 Febrero 2013, 19:45 pm »

Amí me preocupa que esos códigos que publicaste tengan partes parecidas a esto:
http://foro.elhacker.net/programacion_cc/atoi_itoa_personalizadas-t358459.0.html;msg1735068#msg1735068
A no ser que seas blackzero.
No, el es otro usuario con quien he tenido el gusto de conversar en algunos temas, por ejemplo [Ayuda] Error con delete[]... algo extraño....

¿Que es lo que te preocupa?

Otra cosa , las macros están hechas para simplificar y hacer el código más legible, entre otras cosas.. no se de qué libro aprendiste que no era así.
De uno que te recomendé al principio del tema: "The C Programming Language" de Brian W. Kernighan y Dennis M. Ritchie.

Todos sabemos que el código en las macros se copia adonde es invocada, no es en sí resumir código sino para simplificar el entendimiento.
No es lo mismo copiar 2 veces el código de la macro FACTORES, que poner 2 veces una sóla línea que diga FACTORES(). Me extraña que no lo entiendas porque eras el más interesado en resumir líneas de TEXTO..
No. Yo estoy interesado en reducir el código fuente y eso no se consigue con macros (el numero de sentencias y expresiones es el mismo con o sin ellas). Ejemplos de ello los tienes en este tema, por ejemplo eliminar el array.

Se entiende que el que usa la macro FACTORES la conoce, sabe su código, no necesita verlo repetido tantas veces. Si no entendés la macro no la uses porque en ese caso, si tenés razón, el código sería más ilegible.

Mi consejo entonces es que no uses macros que no entiendas.
Primero me cuestionas con una Falacia del hombre de paja y ahora con un Argumento ad hominem. Te aclaro: no respondo a ese tipo de comentarios.

Mi argumento es: la mayoría de tus macros no mejoran la claridad del código fuente como tampoco facilitan su desarrollo. Digo "la mayoría" y no "todas" porque haz estado actualizando tus programas.

Bueno, si piensas que mi argumento esta errado podemos discutirlo, no hay problema.

ITOA no fue mayormente revisada, sólo hice algunas pruebas generales, las que aparecen en el ENTRY. Tiene dos bloques de código bastante parecidos como muy bien notaste, y no estaría nada mal inventar algo para usar sólo un bloque de entre ambos.
OK. Solo una recomendación: coloca el código fuente de las funciones en un solo lugar (tu primer mensaje).

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
funcion ITOA
Programación C/C++
mapers 1 5,175 Último mensaje 27 Diciembre 2010, 06:18 am
por [L]ord [R]NA
atoi + itoa personalizadas
Programación C/C++
david_BS 2 3,440 Último mensaje 7 Abril 2012, 10:40 am
por david_BS
Convertir matriz Char a Int con atoi
Programación C/C++
jfap45 5 6,287 Último mensaje 9 Agosto 2012, 02:46 am
por BlackZeroX
¿Algoritmo alterno a itoa?
Programación C/C++
AlbertoBSD 4 3,057 Último mensaje 15 Mayo 2016, 05:36 am
por AlbertoBSD
Duda con la función atoi()
Programación C/C++
Locura_23 3 3,807 Último mensaje 9 Mayo 2021, 23:05 pm
por Locura_23
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines