Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   busquedas (https://www.clubdelphi.com/foros/showthread.php?t=2683)

chuley 01-08-2003 21:44:21

busquedas
 
Buenas a todos :

La pregunta es un poco rara , Utilizo normalmente Delphi como lenguaje de programacion para mis cosas del taller , pero tambien utilizo microcontroladores para mis desarrollos, con distintos lenguajes , acostumbrado a utilizar funciones como locate a la hora de ubicar un registro en una tabla , no me di cuenta de lo laborioso que es buscar un registro en particular entre cientos o miles .
ahora necesito hacer una especie de funcion parecida a locate de delphi pero con la salvedad de que es para micro , ya realize una pero no se si es eficiente por eso ando buscando algun fuente que me demuestre la manera mas eficiente de buscar , basicamente un conjunto de caracteres o string en una zona de memoria donde se han cargado varios strings , parecida al buscar de cualquier editor.
tiene que ser lo mas basico posible porque tienen que ubicarse en el tipo de dispositivo que se trata no se dispone de funciones de manejo de strings , ni siquiera existe como tal el string , eso lo defino yo

bueno gracias por la atencion y cualquier cosa me avisan
Julio

delphi.com.ar 01-08-2003 21:59:13

Cita:

ando buscando algun fuente que me demuestre la manera mas eficiente de buscar , basicamente un conjunto de caracteres o string en una zona de memoria donde se han cargado varios strings
Me imagino que los controladores los programarás con ASM con un juego reducido de instrucciones propias de cada controlador, como sugerencia te puedo decir que te bases en el StrPos de Delphi, que no hace mas que buscar en un sector de memoria otro sector (recordemos que un PChar es un puntero a caracter utilizado para cadenas terminadas en #0) y su fuente está íntegramente en assembler.

Código:

function StrPos(const Str1, Str2: PChar): PChar; assembler;
asm
        PUSH    EDI
        PUSH    ESI
        PUSH    EBX
        OR      EAX,EAX
        JE      @@2
        OR      EDX,EDX
        JE      @@2
        MOV    EBX,EAX
        MOV    EDI,EDX
        XOR    AL,AL
        MOV    ECX,0FFFFFFFFH
        REPNE  SCASB
        NOT    ECX
        DEC    ECX
        JE      @@2
        MOV    ESI,ECX
        MOV    EDI,EBX
        MOV    ECX,0FFFFFFFFH
        REPNE  SCASB
        NOT    ECX
        SUB    ECX,ESI
        JBE    @@2
        MOV    EDI,EBX
        LEA    EBX,[ESI-1]
@@1:    MOV    ESI,EDX
        LODSB
        REPNE  SCASB
        JNE    @@2
        MOV    EAX,ECX
        PUSH    EDI
        MOV    ECX,EBX
        REPE    CMPSB
        POP    EDI
        MOV    ECX,EAX
        JNE    @@1
        LEA    EAX,[EDI-1]
        JMP    @@3
@@2:    XOR    EAX,EAX
@@3:    POP    EBX
        POP    ESI
        POP    EDI
end;

Como sabrás, el gran problema reside en que no creo que tengas la riqueza de registros e instrucciones de un 8086 o 80386, y seguramente estas funciones están escritas para este último.

Saludos!

chuley 01-08-2003 22:04:07

Es cierto lo que decis pero es parte de lo justamente estaba buscando , lastima no esta documentada con que registros entra la busqueda , esta funcion esta en algun Pas de delphi ?

lo que pusistes es una gran ayuda

gracias

Julio

delphi.com.ar 01-08-2003 22:07:30

El código de esta función esta en la unit SysUtils, te recomiendo que veas _LStrPos de la unit System que tiene un poco mas de documentación.

Saludos!

chuley 01-08-2003 22:10:07

gracias muchas , hasta otro dia

Julio
Argentina

delphi.com.ar 01-08-2003 22:10:31

Cita:

Posteado originalmente por chuley
lastima no esta documentada con que registros entra la busqueda
Te recomiendo que busques información sobre utilización de assembler en Delphi, habría que saber que registros usa para pasar los parámetros Str1, Str2 aunque no creo que sea difícil de averiguar si utilizas el "CPU Window" para debuggear la aplicación.

Saludos nuevamente!

chuley 01-08-2003 22:31:41

Esta barbaro , la funcion encontrada en System como dijistes , en realidad busca un str dentro de otro , pero de por si ya salta algo que yo no hago y ahorra tiempo , que es comparar los tamaños de el blanco con la busqueda para descartarlo en pocas instrucciones , ya estoy viendo como agregarla , en cuestion de micro esta ya es importante puede ahorrar tiempos de cpu de forma barbara .
lo que estoy haciendo es buscar un codigo de barra dentro de un monton en memoria con un pequeño recolector de datos que estoy construyendo

y algunos formatos de codigos tienen diferente tamaño

hasta luego y gracias otra vez


La franja horaria es GMT +2. Ahora son las 08:04:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi