elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 09:05  


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo, raul338)
| | |-+  [Source] cPushSort
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Source] cPushSort  (Leído 445 veces)
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.832


I'Love...!¡.


Ver Perfil WWW
[Source] cPushSort
« en: 27 Septiembre 2011, 04:33 »

.
Esta clase solo sive para agregar elementos y buscar dichos elementos de la manera ams rapida posible que con un simple array y un simple for next.

* Permite Agregar un array long (Se puede mejorar el algoritmo respecto a esto, pero lo deje asi.).
* Permite agregar Elementos Unicos en el momento que se desee.
* Retorna la posicion (IndexOf) si se encuentra de lo contrario retorna un valor constante INVALIDVALUEARRAY.
* Permite consultar X elemento ( GetElement).
* Permite eliminar X elemento segun su indice ( Remove(); posiblemente se tenga que buscar primero con IndexOf() ).
* Retorna la cantidad de elementos.
* Tiene una tasa de BUSQUEDA MUY RAPIDA.

Código
 
'
'   /////////////////////////////////////////////////////////////
'   //                                                         //
'   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
'   //                                                         //
'   // Web:     http://InfrAngeluX.Sytes.Net/                  //
'   //                                                         //
'   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
'   // no se eliminen los creditos originales de este codigo   //
'   // No importando que sea modificado/editado o engrandesido //
'   // o achicado, si es en base a este codigo                 //
'   /////////////////////////////////////////////////////////////

Option Explicit
 
Private lMem()          As Long
Private lCount          As Long
Private bDuplicate      As Boolean
 
Public Sub clear()
   Erase lMem()
   lCount = 0
End Sub
 
Public Property Get Count() As Long
   Count = lCount
End Property
 
'   //  Retorna la cantidad de elementos restantes.
Public Function Remove(ByVal lIndex As Long) As Long
   Remove = RemoveInArrayLong(lIndex, lMem())
End Function
 
Public Property Get DuplicateElements() As Boolean
   DuplicateElements = bDuplicate
End Property
 
Public Property Let DuplicateElements(ByVal bBool As Boolean)
   bDuplicate = bBool
End Property
 
'   //  Agrega un array a la coleccion y retorna la cantidad de elementos agregados a ella.
Public Function AddArray(ByRef lArray() As Long) As Long
Dim i                   As Long
Dim c                   As Long
   If Not (ItsArrayINI(VarPtrA(lArray))) Then Exit Function
   c = lCount
   For i = LBound(lArray()) To UBound(lArray())
       Me.Add lArray(i)
   Next
   AddArray = (lCount - c) '   //  Cantidad de elementos REALMENTE AGREGADOS: es igual a la direfencia del valor anterior y el actual de lCount.
End Function
 
'   //  Inserta en el Array el elemento Dado de manera Ascendente.
'   //  Agrega lVal en la coleccion de manera ordenada, y retorna el indice de su hubicacion.
'   //  Se retorna el indice de la hubicacion (...cambia este indice si se agrega otro y es menor a este...).
Public Function Add(ByVal lVal As Long) As Long
Dim lRetPos             As Long
   '   //  Buscamos la posicion en donde insertar...
   If ExitsInArray(lVal, lMem(), lRetPos) And Not bDuplicate Then Exit Function
   ReDim Preserve lMem(lCount)
   lCount = (lCount + 1)
   If ((lCount - 1) - lRetPos) Then '   //  Recorremos a la derecha TODOS los elementos.
       CopyMemory VarPtr(lMem(lRetPos + 1)), VarPtr(lMem(lRetPos)), ((lCount - lRetPos) * &H4)
   End If
   lMem(lRetPos) = lVal
   Add = lRetPos
End Function
 
'   //  Obtenemos una copia de la coleccion de elementos.
Public Function GetArray() As Long()
   GetArray = lMem()
End Function
 
Public Function IndexOf(ByVal lVal As Long) As Long
   If Not ExitsInArray(lVal, lMem, IndexOf) Then IndexOf = INVALIDVALUEARRAY
End Function
 
Public Function GetElement(ByVal lIndex As Long) As Long
   If (lIndex < lCount) Then GetElement = lMem(lIndex)
End Function
 
Private Function ExitsInArray(ByRef lVal As Long, ByRef lArray() As Long, ByRef lRetPos As Long) As Boolean
Dim lLIndex                 As Long
Dim lUIndex                 As Long
Dim iSortType               As Long
 
   If Not (ItsArrayINI(VarPtrA(lArray))) Then lRetPos = 0: Exit Function
 
   lLIndex = LBound(lArray())
   lUIndex = UBound(lArray())
 
   If (lArray(lUIndex) < lArray(lLIndex)) Then
       SwapLong lLIndex, lUIndex
       iSortType = 1
   End If
 
   If (lVal < lArray(lLIndex)) Then
       lRetPos = lLIndex
   ElseIf (lVal = lArray(lLIndex)) Then
       lRetPos = lLIndex
       ExitsInArray = True
   Else
       If (lVal > lArray(lUIndex)) Then
           lRetPos = lUIndex
       ElseIf (lVal = lArray(lUIndex)) Then
           lRetPos = lUIndex
           ExitsInArray = True
       Else
           Do Until ExitsInArray
               lRetPos = ((lLIndex + lUIndex) \ 2)
               If ((lRetPos <> lLIndex) And (lRetPos <> lUIndex)) Then
                   If (lArray(lRetPos) < lVal) Then
                       lLIndex = lRetPos
                   ElseIf (lArray(lRetPos) > lVal) Then
                       lUIndex = lRetPos
                   ElseIf (lArray(lRetPos) = lVal) Then
                       ExitsInArray = True
                   End If
               Else
                   Exit Do
               End If
           Loop
       End If
   End If
 
   If Not (ExitsInArray) Then              '   //  Obtenemos la posicion donde deberia estar dicho elemento.
       If (iSortType = 1) Then
           If (lArray(lRetPos) > lVal) Then lRetPos = (lRetPos - 1)
       Else
           If (lArray(lRetPos) < lVal) Then lRetPos = (lRetPos + 1)
       End If
   End If
 
End Function
 
Private Sub Class_Terminate()
   Call Me.clear
End Sub
 
 

En un Modulo...
Código
 
Option Explicit
 
Public Const INVALIDVALUEARRAY As Long = (-1)
 
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDest As Long, ByVal pSrc As Long, ByVal ByteLen As Long)
Public Declare Function VarPtrA Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
 
Public Function ItsArrayINI(ByVal lngPtr As Long, Optional LnBytes As Long = 4) As Boolean
Dim lng_PtrSA                   As Long
   If ((lngPtr <> 0) And (LnBytes > 0)) Then
       Call CopyMemory(ByVal VarPtr(lng_PtrSA), ByVal lngPtr, LnBytes)
       ItsArrayINI = (Not (lng_PtrSA = 0))
   End If
End Function
 
Public Sub SwapLong(ByRef lVal1 As Long, ByRef lval2 As Long)
   lval2 = lval2 Xor lVal1
   lVal1 = lVal1 Xor lval2
   lval2 = lval2 Xor lVal1
End Sub
 
'   //  Return (Cantidad de elementos).
Public Function RemoveInArrayLong(ByVal lIndex As Long, ByRef lArray() As Long) As Long
   If (ItsArrayINI(VarPtrA(lArray)) = True) Then
       RemoveInArrayLong = UBound(lArray)
       If Not ((lIndex < 0) Or (lIndex > RemoveInArrayLong)) Then
           If Not (lIndex = RemoveInArrayLong) Then
               Call CopyMemory(ByVal VarPtr(lArray(lIndex)), ByVal VarPtr(lArray(lIndex + 1)), (RemoveInArrayLong - lIndex) * 4)
           End If
           If ((RemoveInArrayLong - 1) > INVALIDVALUEARRAY) Then
               ReDim Preserve lArray(RemoveInArrayLong - 1)
           Else
               Erase lArray()
           End If
       End If
   End If
End Function
 
 

Temibles Lunas!¡.


En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
raul338
Moderador
***
Desconectado Desconectado

Mensajes: 2.372


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: [Source] cPushSort
« Respuesta #1 en: 27 Septiembre 2011, 14:12 »

Se ve bien, aunque, utilizas InsertionSort no?

Podrías aplicar un proceso de ordenado para hacerlo "personalizable" (ej, que llame a un evento para indicar cual es "mayor" o "menor" y pasarle punteros a clases o tipos :P)


En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.832


I'Love...!¡.


Ver Perfil WWW
Re: [Source] cPushSort
« Respuesta #2 en: 27 Septiembre 2011, 19:53 »

Por eso es OpenSource!¡.

Dulces Lunas!¡.
En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.832


I'Love...!¡.


Ver Perfil WWW
Re: [Source] cPushSort
« Respuesta #3 en: 7 Octubre 2011, 20:10 »

Se ve bien, aunque, utilizas InsertionSort no?

Si a mi modo pero si es ese xP

Dulces Lunas!¡.
En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
CS Source!!!
Juegos y Consolas
Gust Over 2 524 Último mensaje 27 Junio 2005, 15:08
por Sagman
PHP/JSP Source
Hacking Básico
ThE BuG 0 373 Último mensaje 8 Diciembre 2005, 19:58
por ThE BuG
dod source
Dudas Generales
ozores69 0 249 Último mensaje 28 Junio 2006, 13:44
por ozores69
CS Source En Red
Juegos y Consolas
Ciku 4 569 Último mensaje 19 Agosto 2007, 15:57
por Ciku
CS source y 1.6
Juegos y Consolas
Juanlu 2 635 Último mensaje 18 Junio 2007, 12:19
por kek_500
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines