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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [RETO] Alternativa a Instr()
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 4 5 Ir Abajo Respuesta Imprimir
Autor Tema: [RETO] Alternativa a Instr()  (Leído 17,473 veces)
Tokes

Desconectado Desconectado

Mensajes: 140


Ver Perfil
Re: [RETO] Alternativa a Instr()
« Respuesta #10 en: 1 Enero 2011, 04:29 am »

Saludos:

Aquí les dejo una mejora (creo) del código de raul338. La he llamado Ratok338InStr:

Código:
Private Function RaTok338InStr(ByVal Start As Long, ByVal s1 As String, ByVal s2 As String) As Long
Dim pos1 As Long, long1 As Long, long2 As Long, lim As Long, c As String

    If Start And &H80000000 Then Start = -Start
   
    long1 = Len(s1)
    long2 = Len(s2)
   
    If long1 = 0 Or long2 = 0 Or Start > long1 Or Start = 0 Or long2 > long1 Then
        RaTok338InStr = -1
        Exit Function
    End If
    lim = long1 - long2 + 1
    c = Mid(s2, 1, 1)
    For pos1 = Start To lim
        If Mid(s1, pos1, 1) = c Then
            If Mid(s1, pos1, long2) = s2 Then
                RaTok338InStr = pos1
                Exit Function
            End If
        End If
    Next
End Function

Hasta la próxima.


En línea

Sanlegas

Desconectado Desconectado

Mensajes: 131


https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-


Ver Perfil
Re: [RETO] Alternativa a Instr()
« Respuesta #11 en: 1 Enero 2011, 05:32 am »

aca el mio  :D
Código:
Public Function InstrNew(ByVal Start As Integer, ByVal Str1 As String, ByVal Str2 As String) As Integer
If Start = 0 Or Str1 = "" Or Str2 = "" Then
    InstrNew = -1
    Exit Function
End If
Do While Start <= Len(Str1)
    If Mid(Str1, Start, Len(Str2)) = Str2 Then
        InstrNew = Start
        Exit Function
    End If
    Start = Start + 1
Loop
End Function

una pregunta... como lo pongo con colores  :xD?


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Alternativa a Instr()
« Respuesta #12 en: 1 Enero 2011, 09:24 am »

.
mmmm No se que tan rapida sea mi funcion pero cumple su cometido xP

Código
  1.  
  2. Public Function RetInstr(ByVal Start As String, ByVal String1 As String, ByVal String2 As String, Optional ByVal Compare As VbCompareMethod = VbCompareMethod.vbBinaryCompare) As Long
  3. Dim Var_Arr  As Variant
  4. Dim lng_ST1  As Long
  5. Dim lng_UST  As Long
  6.    lng_ST1 = Len(String1)
  7.    If Not Start > lng_ST1 Then
  8.        Var_Arr = Split(Right$(String1, lng_ST1 - Start), String2, 2, Compare)
  9.        lng_UST = UBound(Var_Arr)
  10.        If lng_UST > 0 Then
  11.            RetInstr = Start + Len(Var_Arr(0)) + 1
  12.        End If
  13.    End If
  14. End Function
  15.  
  16.  

Dulces Lunas!¡.
.
En línea

The Dark Shadow is my passion.
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Alternativa a Instr()
« Respuesta #13 en: 1 Enero 2011, 09:56 am »

.
Bueno aquí mas corto... ojala nos dejara VB6 usar apuntadores tan facil como en C... asi seria otra historia.

Como no quiero gastar mucho el Do Loop o el For Nest por que se gastan ( jaja ) use las Split().

Código
  1.  
  2. Public Function RetInstr(ByVal Start As String, ByVal String1 As String, ByVal String2 As String, Optional ByVal Compare As VbCompareMethod = VbCompareMethod.vbBinaryCompare) As Long
  3. Dim lng_ST1  As Long
  4.    lng_ST1 = Len(String1)
  5.    If Not Start > lng_ST1 Then
  6.        RetInstr = Start + Len(Split(Right$(String1, lng_ST1 - Start), String2, 2, Compare)(0)) + 1
  7.        If RetInstr > lng_ST1 Then RetInstr = 0
  8.    End If
  9. End Function
  10.  
  11.  

Dulces Lunas!¡.
.
En línea

The Dark Shadow is my passion.
TGa.

Desconectado Desconectado

Mensajes: 43



Ver Perfil
Re: [RETO] Alternativa a Instr()
« Respuesta #14 en: 1 Enero 2011, 10:23 am »

Listo ya modifique mi funcion tenia un pequeño error, creo que ya no da resultados erroneos.
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [RETO] Alternativa a Instr()
« Respuesta #15 en: 1 Enero 2011, 11:35 am »

Ya corregi el código (creo), ahora no tengo mucho tiempo. :-\
Pensé que iría más rápido si trabajaba con Bytes... :silbar: :-(
Ya haré más versiones.  >:D

DoEvents! :P
« Última modificación: 1 Enero 2011, 11:52 am por Mr. Frog © » En línea

krabby

Desconectado Desconectado

Mensajes: 22



Ver Perfil
Re: [RETO] Alternativa a Instr()
« Respuesta #16 en: 1 Enero 2011, 13:49 pm »

hola super bien el reto que has propuesto Mr Frog., aki mi code, esta comentado, lo probe y no tiene fallas.
si le encuentran una falla me dicen y me lanzo del 5to piso.
usa la misma sintaxis que el instr()

Código:
Option Explicit

Public Function Rapidash(Posicion As Long, CadenaDondeBuscar As String, MiCadenaBuscar As String) As Long
    Dim Cadena As String, CadenaBuscar As String
    Cadena = CadenaDondeBuscar
    CadenaBuscar = MiCadenaBuscar
    'si cadena es menor q cadenabuscar, entonces cadenabuscar no esta
    'contenida dentro de cadena
    If Len(Cadena) < Len(CadenaBuscar) Then Exit Function
    'si posicion es mayor a texto, entonces no hay donde buscar
    'porque posicion excede el tamaño de la cadena
    If Posicion > Len(Cadena) Then Exit Function
    'posicion debe ser igual o mayor a1
    If Posicion < 1 Then Exit Function
    'si no hay cadenabuscar salimos
    If Len(CadenaBuscar) = 0 Then Exit Function
    'la cadena serà partida en 2 desde posicion
    'en caso de que posicion sea mayor a 1
    'es para simplificar el trabajo de busqueda
    'extra almacena el tamaño de la primera
    'parte del string partido
    
    Dim Extra As Long
    If Posicion > 1 Then
        'coge la porcion de cadena indicada por Posicion
        'para simplificar la busqueda
        Cadena = Mid(Cadena, Posicion)
        Extra = Posicion - 1
    End If

    Dim arrCad() As String, TamCadenaBuscar As Long, Resul As Long
    TamCadenaBuscar = Len(CadenaBuscar)
    'comprueba si la cadena se encuentra al inicio y le suma
    'lo Extra en caso de que se haya partido la cadena en 2 y sale
    If Left(Cadena, TamCadenaBuscar) = CadenaBuscar Then
        Resul = 1 + Extra
    Else
        'comprueba si la CadenaBuscar existe dentro
        'de cadena
        Dim tmp As String
        tmp = Replace(Cadena, CadenaBuscar, "")
        'si no varia el tamaño kiere decir
        ' q "NO" se encontro CadenaBuscar y sale
        'esto es para no caer en el split
        'y se produzca un error al sumar
        'el len(arrCad(0)), ya q si split falla
        'no habrà el inidce cero "0"
        If Len(tmp) = Len(Cadena) Then
            Exit Function
        End If
        'si llega aki entonces se encontro la CadenaBuscar
        arrCad = Split(Cadena, CadenaBuscar)
        'suma el extra y el tamaño
        'arrCad(0) simpre va contener el string
        'anterior a cadenabuscar, por eso la suma de abajo
        Resul = Len(arrCad(0)) + 1 + Extra
    End If
    
    Rapidash = Resul
End Function

Código:
Private Sub Form_Load()
    Dim Pos As Long
    Dim UnaCadena As String
    Dim CadenaBuscar As String
    UnaCadena = "hola que tal viejo, me llamo pepe"
    CadenaBuscar = "viejo"
    Pos = Rapidash(1, UnaCadena, CadenaBuscar)
    MsgBox "Resultado Rapidash: " & Pos
    Pos = InStr(1, UnaCadena, CadenaBuscar)
    MsgBox "Resultado InStr: " & Pos
End Sub

salu2
« Última modificación: 1 Enero 2011, 14:44 pm por krabby » En línea

krabby

Desconectado Desconectado

Mensajes: 22



Ver Perfil
Re: [RETO] Alternativa a Instr()
« Respuesta #17 en: 1 Enero 2011, 16:10 pm »

el proyecto que subieron para probar las funciones tiene errores, lo descargue, y algunos resultados no son correctos.
debajo de main donde dice 'raul388 , pasas los parametros incorrectos:

Código:
    '' ================ COMPROBACION ===========================
    Debug.Print "============ COMPROBACION ============"
        cFirst = InStr(firstPos, SearchString, SearchChar)
        cSecond = InStr(secondPos, SearchString, SearchChar)
        cThird = InStr(thirdPos, SearchString, SearchChar)
    Debug.Print "Valores de InStr: ", , cFirst, cSecond, cThird
   
    ' Raul338
    tFirst = rInStr(firstPos, SearchChar, SearchString)
    tSecond = rInStr(secondPos, SearchChar, SearchString)
    tThird = rInStr(thirdPos, SearchChar, SearchString)
    If tFirst <> cFirst Or tSecond <> cSecond Or tThird <> cThird Then
        Debug.Print "Raul338 no devuelve los mismos valores", tFirst, tSecond, tThird
    End If
   
    ' Miseryk
    tFirst = myInstr(firstPos, SearchString, SearchChar)
    tSecond = myInstr(secondPos, SearchString, SearchChar)
    tThird = myInstr(thirdPos, SearchString, SearchChar)
    If tFirst <> cFirst Or tSecond <> cSecond Or tThird <> cThird Then
        Debug.Print "Miseryk no devuelve los mismos valores", tFirst, tSecond, tThird
    End If

el orden de parametros de instr y myInstr(de Miseryc) son iguales (firstPos, SearchString, SearchChar),  pero en el de raul338 esta al reves (firstPos, SearchChar, SearchString).
En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: [RETO] Alternativa a Instr()
« Respuesta #18 en: 1 Enero 2011, 18:09 pm »

jeje si, año nuevo, cabeza nueva, pense que toda la vida lo usaba asi y lo puse asi :xD ya cambio la firma

Hay actualizo mi funcion :)

Benchmark actualizados

1
Código:
============ RETO INSTR 31/12/10 ============
String a buscar:            col
String donde buscar:        Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas:               250          
3 Offsets:     1             10            20

============ COMPROBACION ============
Valores de InStr:                          67            67            67

============ VELOCIDAD ============
InStr          0,864775284178946
Raul338        18,3623837347693
Miseryk        30,7958742805302
gaston93       3,87963529112102
Mr Frog        7,84405750497397
Tokes          30,0233925932865
79137913       20,6618641060995
Tokes v2       17,7496594728775
Tenient101     19,7694039508204
BlackZeroX     5,31231935060211
krabby         7,9775094908101

2
Código:
============ RETO INSTR 31/12/10 ============
String a buscar:            la
String donde buscar:        Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas:               250          

3 Offsets:     1             10            20
============ COMPROBACION ============
Valores de InStr:                          4             10            34
BlackZeroX no devuelve los mismos valores  4             16            34

============ VELOCIDAD ============
InStr          0,599789684803091
Raul338        3,56973796574262
Miseryk        4,66494248411889
gaston93       6,10917527314349
Mr Frog        4,43525108542018
Tokes          4,75540753220973
79137913       3,40099819519021
Tokes v2       3,20082021643602
Tenient101     2,88387175007523
BlackZeroX     4,6777744058339
krabby         7,79785617083907

3
Código:

============ RETO INSTR 31/12/10 ============
String a buscar:            Ñ
String donde buscar:        Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas:               250          

3 Offsets:     1             10            20
============ COMPROBACION ============
Valores de InStr:                          0             0             0

============ VELOCIDAD ============
InStr          0,706294635037691
Raul338        26,3284343194879
Miseryk        95,6028468901517
gaston93       3,07185940320015
Mr Frog        0,653042159920391
Tokes          48,7631246499291
79137913       31,470826946779
Tokes v2       27,1888146704795
Tenient101     35,9883049865489
BlackZeroX     3,53637496928359
krabby         3,62555682520292

y el proyecto con las funciones actualizadas :)

http://www.mediafire.com/?bbr7r0s90xmgtp6

PD: EL codigo exclusivamente de vb se pone asi [code=vb]Dim s as string[/code]

Quedando
Código
  1. Dim s as string
« Última modificación: 1 Enero 2011, 18:11 pm por raul338 » En línea

krabby

Desconectado Desconectado

Mensajes: 22



Ver Perfil
Re: [RETO] Alternativa a Instr()
« Respuesta #19 en: 1 Enero 2011, 20:12 pm »

supongo que dices por lo del color, no sabia lo de poner el code =vb, igual no es muy conveniente cuando kieres copiar / pegar un codigo que tiene esas etiquetas, porque en vez de salir los saltos de linea salen unos espacios y hay que editar el codigo poniendo lo saltos correspondientes.
voi a bajar y provar como va ahora tu tester de funciones corregido.
un saludo
En línea

Páginas: 1 [2] 3 4 5 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[AYUDA] Usar INSTR 2 veces
Programación Visual Basic
Rudy21 5 2,699 Último mensaje 9 Julio 2008, 04:01 am
por cassiani
como cargar 100 KBs en una variable; problema con InStr
Programación Visual Basic
drakolive 5 2,831 Último mensaje 31 Diciembre 2008, 15:20 pm
por Dessa
Instr para byte arrays [src]
Programación Visual Basic
cobein 3 2,173 Último mensaje 31 Mayo 2009, 12:42 pm
por cobein
Alternativa a pow? [c] « 1 2 »
Programación C/C++
flacc 10 11,208 Último mensaje 11 Diciembre 2010, 15:25 pm
por pucheto
[ANSI C] Split(), strlen(), mid(), Instr(), strcpy(). « 1 2 »
Programación C/C++
BlackZeroX 11 9,756 Último mensaje 14 Enero 2011, 02:35 am
por Littlehorse
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines