Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - BlackZeroX

#1141
Programación C/C++ / Re: [C]isNumeric (VB6 a C)
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!¡.
#1142
Cita de: Queta en 18 Agosto 2011, 20:17 PM
¿Y el porqué de esta macro tan innecesaria?

leete esto: macros

Hasta donde he visto la bibioteca string.h no tiene definida strrev como macro

* Trato de cadenas, codificacion, Busqueda de patrones, palabras capicua, palindromos... y un largo etc, no se debe usar de manera explicita este algorimo, puede ser acoplado de igual manera a X indole.

Dulces Lunas!¡.
#1143
Cita de: escabe en 18 Agosto 2011, 10:23 AM
¿Y por qué no usar ANSI C?

char *strrev(char *s);

Saludos.

Se esta usando ANSI C, quizas querias decir "la libreria de C"

strrev solo funciona con strings, encambio mi funcion funciona con una longitud dada.

Dulces Lunas!¡.
#1144
.
Te dejo mi version:



#define BYTE unsigned char

BYTE* reverse(BYTE* pbyData, size_t szSize) {
    size_t i = 0x0;
    if (szSize > 1)
        for (;i < --szSize; i++) {
            pbyData[i]      ^= pbyData[szSize];
            pbyData[szSize] ^= pbyData[i];
            pbyData[i]      ^= pbyData[szSize];
        }
    return pbyData;
}

int main()
{
    char  szCadena[]  = "Hola Mundo";
    printf("%s\n", reverse((BYTE*)szCadena, strlen(szCadena)));
    getchar();
    return 0;
}

#1145

Les dejo mi funcion en C para quien la quiera.

http://foro.elhacker.net/programacion_cc/cisnumeric_vb6_a_c-t336564.0.html

Dulces Lunas!¡.
#1146
Programación C/C++ / [C]isNumeric (VB6 a C)
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



La funcion isnumeric_Black esta en VB6, es la version en vb6 de la que esta aqui...



http://foro.elhacker.net/programacion_visual_basic/reto_reemplazo_de_funcion_isnumeric-t336067.0.html;msg1652210#msg1652210

main.cpp



y aqui les dejo la traduccion en C (Las funciones IsNumericA y IsNumericW estan configuradas para trabajar con las Strings de VB6)



#include "main.h"

/**
   @Autor          BlackZeroX
   @Web            http://infrangelux.sytes.net/blog/
   @Reference      http://foro.elhacker.net/programacion_visual_basic/reto_reemplazo_de_funcion_isnumeric-t336067.0.html;msg1652210#msg1652210
   @Description    Libreria para verificar si una Cadena de texto ANSI/UNICODE es numerica con los siguientes formatos:
                   * ###e[+/-]###  {+/-646.45e+546,45}.
                   * ###d[+/-]###  {+/-646.45d+546,45}.
                   * Base 16       {&H4561abcdef}.
                   * Base 10       {+/-456,541.456,545}.
   @Returns        0 si la cadena no contiene ningun formato.
                   1 si la cadena pertenece a algun tipo de formato numerico.
**/

#define PUNTO_DECIMAL     0x10000
#define SIGNO_SRC         0x20000
#define NUMBER_HEX        0x40000
#define NUMBER_HEX_ZERO   0x80000
#define NUMBER_HEX_FLAGS  (NUMBER_HEX | NUMBER_HEX_ZERO)
#define NUMBER_POW        0x100000
#define NUMBER_POW_FINISH 0x200000
#define NUMBER_POW_FLAGS  (NUMBER_POW | NUMBER_POW_FINISH)
#define NUMBER_OF_OK      0x400000
#define NUMBER_OF_FINISH  0x800000
#define NUMBER_OF_FLAGS   (NUMBER_OF_OK | NUMBER_OF_FINISH)

DLL_EXPORT int __stdcall IsNumericA (char *pStr) { return pStr ? IsNumericEx(pStr, *((int*)(pStr - 0x4)), 1): 0; }
DLL_EXPORT int __stdcall IsNumericW (char *pStr) { return pStr ? IsNumericEx(pStr, *((int*)(pStr - 0x4)), 2): 0; }

int IsNumericEx (char *pStr, size_t uiLn, int iStep) {
unsigned int i       = 0x0,  //  For()
            iData   = 0x0;  //  Xor, Switcher, Contador (QWord).

   if (!pStr || !uiLn)
       return 0;

   for (i = 0; i < uiLn; i += iStep) {
       if ((iData & NUMBER_HEX) == NUMBER_HEX) {
           if (((*pStr >= 0x30) && (*pStr <= 0x39)) ||
              ((*pStr >= 0x61) && (*pStr <= 0x66)) ||
              ((*pStr >= 0x41) && (*pStr <= 0x46))) {  //  Numeros Hexadecimales
               if ((iData & NUMBER_OF_FLAGS) == 0x0)   //  Ceros a la izquierda
                   iData |= (*pStr == 0x30) ? NUMBER_HEX_ZERO : NUMBER_OF_OK;

               switch (iData & NUMBER_OF_FLAGS) {
                   case NUMBER_OF_OK:
                       iData++;
                       if ((iData & 0xFF) == 0x11)
                           return 0;   //  QWord (Max Double)
                       iData |= NUMBER_OF_OK;
                       if ((iData | NUMBER_HEX_FLAGS) == NUMBER_HEX_FLAGS)
                           iData ^= NUMBER_HEX_ZERO;
                       break;

                   case NUMBER_OF_FINISH:
                   case NUMBER_OF_FLAGS:
                       return 0;
                       break;
              }
           } else {
               switch (*pStr) {
                   case 0x9:
                   case 0xA:
                   case 0xB:
                   case 0xC:
                   case 0xD:
                   case 0x24:
                   case 0x20:
                   case 0xA0:  //   Espacios en Blanco
                       if ((iData | NUMBER_HEX_FLAGS) == NUMBER_HEX_FLAGS)
                           iData = ((iData ^ NUMBER_HEX_ZERO) | NUMBER_OF_OK);
                       if ((iData & NUMBER_OF_FLAGS) == NUMBER_OF_OK)
                           iData |= NUMBER_OF_FINISH;
                       break;

                   case 0x0:    //  NULL Indica que se termina la cadena.
                       if ((iData & NUMBER_OF_FLAGS) == NUMBER_OF_FINISH)
                           return 0;
                       i = uiLn; //  Exit For.
                       break;

                   default:
                       return 0;
                       break;
               }
           }
       } else {
           if ((*pStr >= 0x30) && (*pStr <= 0x39)) {
               iData |= NUMBER_OF_OK;
               if ((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH)
                   return 0;
               if ((iData & NUMBER_POW_FLAGS) == NUMBER_POW)
                   iData |= NUMBER_POW_FINISH;

           } else {
               switch ((int)*pStr) {
                   case 0x0:    //  NULL Indica que se termina la cadena.
                       if ((iData & NUMBER_POW_FLAGS) == NUMBER_POW)
                           return 0;
                       i = uiLn;    //  Exit For.
                       break;

                   case 0x2E:   //  "."  Solo 1
                       if (((iData & NUMBER_POW_FLAGS) == NUMBER_POW) ||
                          ((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH) ||
                          ((iData & PUNTO_DECIMAL) == PUNTO_DECIMAL))
                           return 0;
                       iData |= PUNTO_DECIMAL;
                       break;

                   case 0x2B:
                   case 0x2D: //  "+|-" Solo 1
                       if ((iData & NUMBER_POW_FLAGS) == NUMBER_POW)
                           iData |= NUMBER_POW_FINISH;

                       else
                           if (((iData & NUMBER_OF_OK) == NUMBER_OF_OK) ||
                              ((iData & PUNTO_DECIMAL) == PUNTO_DECIMAL) ||
                              ((iData & SIGNO_SRC) == SIGNO_SRC))
                           return 0;

                       if ((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH)
                           return 0;

                       iData |= SIGNO_SRC;
                       break;

                   case 0x2C:
                       if ( !((iData & NUMBER_OF_OK) == NUMBER_OF_OK) ||
                             ((iData & NUMBER_POW_FLAGS) == NUMBER_POW))
                           return 0;
                       break;

                   case 0x9:
                   case 0xA:
                   case 0xB:
                   case 0xC:
                   case 0xD:
                   case 0x24:  //  Solo se permiten al inicio de un Numero (Espacios en Blanco).
                       if (((iData & PUNTO_DECIMAL) == PUNTO_DECIMAL) ||
                          ((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH) ||
                          ((iData & NUMBER_OF_OK) == NUMBER_OF_OK) ||
                          ((iData & NUMBER_POW_FLAGS) == NUMBER_POW))
                           return 0;
                       break;

                   case 0xA0:
                   case 0x20: //  Se permiten al Inicio/final de un numero.
                       if ((iData & NUMBER_OF_OK) == NUMBER_OF_OK)
                           iData |= NUMBER_OF_FINISH;
                       else
                           if (((iData & PUNTO_DECIMAL) == PUNTO_DECIMAL) ||
                              ((iData & NUMBER_POW_FLAGS) == NUMBER_POW))
                               return 0;
                       break;

                   case 0x26:   //  Es un Numero Hexadecimal
                       if (((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH) ||
                          ((iData & NUMBER_OF_OK) == NUMBER_OF_OK) ||
                          ((iData & SIGNO_SRC) == SIGNO_SRC) ||
                          ((iData & PUNTO_DECIMAL) == PUNTO_DECIMAL) ||
                          ((iData & NUMBER_POW_FLAGS) == NUMBER_POW))
                           return 0;

                       pStr += iStep;

                       if ((*pStr == 0x48) || (*pStr == 0x68)) {
                           iData |= NUMBER_HEX;
                           iData ^= 0xFF000000;
                           i += iStep;
                       } else {
                           pStr -= iStep;
                       }
                       break;

                   case 0x44:
                   case 0x45:
                   case 0x64:
                   case 0x65:     //  Numeros en Formato ###e-###, ###e+###
                       if (((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH) ||
                          ((iData & NUMBER_POW) == NUMBER_POW))
                           return 0;
                       if ((iData & NUMBER_OF_OK) == NUMBER_OF_OK) {
                           iData |= NUMBER_POW;
                           if ((iData & SIGNO_SRC) == SIGNO_SRC)
                               iData ^= SIGNO_SRC; //  Permitimos nuevamente los signos "+" y "-".
                       } else {
                           return 0;
                       }
                       break;

                   default:
                       return 0;
                       break;

               }   //  switch()
           }   //  if()
       }   //  if()
       pStr += iStep;
   }   //  For()

   switch (iData & NUMBER_OF_FLAGS) {
       case NUMBER_OF_OK:
       case NUMBER_OF_FLAGS:
           return 1;
           break;

       default:
           switch (iData & NUMBER_HEX_FLAGS) {
               case NUMBER_HEX_FLAGS:
                   return 1;
                   break;
           }
   }

   return 0;
}



main.h


#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

#ifdef BUILD_DLL
   #define DLL_EXPORT __declspec(dllexport)
#else
   #define DLL_EXPORT __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C"
{
#endif

DLL_EXPORT int __stdcall IsNumericA (char*);
DLL_EXPORT int __stdcall IsNumericW (char*);
int IsNumericEx (char *pStr, size_t uiLn, int iStep);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__



Dulces Lunas!¡.
#1147
tienes varias opciones una es primero antes de bajar alguna actualizacion verificar por medio de un archivo las versiones y compararlas con la de tus archivos actuales, y solo si falta, o la version es inferior, bajar el nuevo archivo, esto lo puedes hacer con un split...

Dulces Lunas!¡.
#1148
Programación C/C++ / Re: Crear DLL
16 Agosto 2011, 21:33 PM
fue mas facil, debia meter esta linea al linker

-Wl,--add-stdcall-alias

Dulces Lunas!¡.
#1149
mmm espero sirva esto es teorico por que jamas uso WebBrowser

document.getelementbyid("ID Tag") = "Path"

algo va asi, un que creo que me falto un innerHTML... aun que no creo en este caso.

Dulces Lunas!¡.
#1150
yo lo haria por medio de plugins, son mas livianos/faciles al momento de descargar.

Dulces Lunas1¡,