Título: [C]isNumeric (VB6 a C) Publicado por: BlackZeroX en 16 Agosto 2011, 22:45 pm .
Se trabajan las funciones a nivel Bit, ambas funciones son mas rapidas que la nativa en vb6. Funcion en VB6 Codigos para descargar... Archivos Fuente dll, y Compilados (http://infrangelux.sytes.net/filex/index.php?dir=/BlackZeroX/Programacion/vb6/Retos/isnumeric) (http://infrangelux.sytes.net/filex/view.php?InfraFile=/BlackZeroX/Programacion/vb6/Retos/isnumeric/Resultados.png) La funcion isnumeric_Black esta en VB6, es la version en vb6 de la que esta aqui... Código:
y aqui les dejo la traduccion en C (Las funciones IsNumericA y IsNumericW estan configuradas para trabajar con las Strings de VB6) Código
main.h Código
Dulces Lunas!¡. Título: Re: [C]isNumeric (VB6 a C) Publicado por: rir3760 en 19 Agosto 2011, 17:55 pm En el caso de C y si la intención es validar solo tipos enteros se puede utilizar la función strtol (prototipo en <stdlib.h>) dejando a esta la mayor parte del trabajo. Por ejemplo:
Código
Para números de tipo flotante se puede tomar una aproximación similar utilizando strtod (prototipo tambien en <stdlib.h>). Un saludo Título: Re: [C]isNumeric (VB6 a C) Publicado por: someRandomCode en 19 Agosto 2011, 20:36 pm O, existen todos estos:
int isalnum(int c); int isalpha(int c); int isascii(int c); int isblank(int c); int isdigit(int c); int isxdigit(int c); Que los podes encontrar en ctype.h Dejo esos, y si lo que queres es validar una cadena: Código: int isnumeric(char * cadena) { Título: Re: [C]isNumeric (VB6 a C) Publicado por: BlackZeroX en 19 Agosto 2011, 23:51 pm @rir3760.
@someRandomCode Las funciones son buenas pero ineficientes, el caso es detectar una cadena con espacios validos y con formato valido, sin decir que debe ser RAPIDA: * Numeros Enteros. * Numeros con Punto decimal. * Numeros con formato Hexadecimal de tamaño QWord. * Numeros en NOTACION Cientifica. * Las comas funcionan como separadores numericos de miles. * En TODOS los casos anterior pueden ser tanto positivos como negativos. Pasen a el post citado y veran una serie de Strings con una variedad amplia de formatos a probar en las funciones, ya que las vuestras se quedan a medias aun cuando son en C no superan en lo abosuluto ni siquiera a la que hice en vb6. Dulces Lunas!¡. Título: Re: [C]isNumeric (VB6 a C) Publicado por: someRandomCode en 20 Agosto 2011, 01:16 am Hmm, no se, podrias aportar tiempos para las mismas?
No obstante, lo que propusiste tambien es una funcion, de tamaño un poco grandota. Las funciones pueden ser ineficientes por todo lo que acarrea su invocacion, pero no te olvides que vivimos en una era donde un call o un ret no se consumen tantos ciclos como para morirse... Ademas de que Visual Basic (aclaremos la version, ademas, porque varia) es bastante lento por tener que cargar de todo. Ubound y Lbound por ejemplo son funciones. Que estas usando ahi adentro. Lo interesante seria que agarres y hagas un Time (GetSystemTimeMillis) antes y despues, y probeas un test case para demostrar que es cierto. En general es buena idea no reinvetar la rueda, y tratar de usar cosas que ya han dado vueltas optimizadas por alguna gente que tiene el ojo en el tema. Ojo, no estoy desmereciendo ni diciendo nada pero me da pereza bajarme VB, y hacer la prueba yo.. Título: Re: [C]isNumeric (VB6 a C) Publicado por: BlackZeroX en 20 Agosto 2011, 02:40 am .
Los test (tiempos) ya estan en la url... esta funcion trabaja a nivel Bit y es una traduccion mera de la que esta en vb6, tiene un tiempo de diferencia de 5-10 msc respectivamente a 1000 ciclos con varias strings a probar, lo unico en lo que radica esta verison con la de vb6, es que en VB6 no puedo trabajar directamente con cada caracter, y en esta si, en la de vb6 use RtlMoveMemory para tal cosa. A esta version le saque dos variantes segun las string a probar es decir ANSI y UNICODE. La funcion es grandota pero trabaja tan rapido como lo permiten las operaciones a nivel Bit y por punteros sin usar tanta memoria para las variables booleanas, en la de vb6 tomo partido de la longitud INT32 como es nativo de vb6 y de igual manera sacandole partido a las operaciones a nivel Bit... En el caso de reinventar la rueda: * Es cierto, pero si la funcion es lenta... o no cumple las espectativas, o mejor aun si no la puedes editar mejor recrearla, en este caso salio una funcion mas optimizada que la de vb6 y a su vez mas rapida, creo que reinventar la rueda en ocasiones tiene sus ventajas. No soy el unico que hace este tipo de cosas: VBSpeed (http://www.xbeat.net/vbspeed/) Nota: No use en ningun momento LBound ni Ubound ya que no ocupo ningun tipo de array, estas funciones trabajan directamente con la estructura del SafeArray de un Array como es obvio... Dulces Lunas!¡. Título: Re: [C]isNumeric (VB6 a C) Publicado por: BlackZeroX en 20 Agosto 2011, 02:50 am .
Los tiempos se han calculado con las APIS: @kernel32 QueryPerformanceCounter QueryPerformanceFrequency Dulces Lunas!¡. Título: Re: [C]isNumeric (VB6 a C) Publicado por: someRandomCode en 20 Agosto 2011, 02:55 am Seria interesante que alguien los postee para no tener que hacerlo(como en realidad dije antes), je igual bien que si hicieron las pruebas, quede.
Y saber bien la metodologia que usaron para medirlo, pero esta bien, si usted lo dice felicitaciones atrasadas (porque hasta donde veo, es de hace raaato el thread :) ) Título: Re: [C]isNumeric (VB6 a C) Publicado por: BlackZeroX en 20 Agosto 2011, 03:21 am .
No te molesta si te dejo el EXE?, igual pongo una captura. Archivos Fuente dll, y Compilados (http://infrangelux.sytes.net/filex/index.php?dir=/BlackZeroX/Programacion/vb6/Retos/isnumeric) (http://infrangelux.sytes.net/filex/view.php?InfraFile=/BlackZeroX/Programacion/vb6/Retos/isnumeric/Resultados.png) La funcion isnumeric_Black esta en VB6, es la version en vb6 de la que esta aqui... Dulces Lunas!¡. |