Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Comparar Dos Arrays Dinámicos O Nativos
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Comparar Dos Arrays Dinámicos O Nativos 
 
Buenos días!.

La idea es, comparar dos arrays y ver si estos son iguales.
Para que sean iguales, sus longitudes deben de ser la misma y el valor que contiene cada uno de sus indices deben ser iguales.
Vayamos primero con el ejemplo en Gambas.

Public Sub Main()
  
  Print ComparaArray1([1, 2], [1, 2])
  
  Print ComparaArray2([1, 2], [1, 2])
  
End

'' Compara dos arrays
Public Sub ComparaArray1(a1 As Integer[], a2 As Integer[]) As Boolean
  'No funciona

  If a1.Count = a2.Count And a1 = a2 Then
    Return True
  Else
    Return False
  Endif
  
End

'' Compara dos arrays
Public Sub ComparaArray2(a1 As Integer[], a2 As Integer[]) As Boolean
  
  Dim i As Integer  
  
  If a1.Length = a2.Length Then  
    For i = 0 To a1.Max
      If a1[i] <> a2[i] Then Return False      
    Next
    Return True      
  Endif
  
  Return False
  
End

 


Salida:
Citar:

False
True


¿ Por que gambas no es capaz de comparar dos arrays directamente ?.
¿ Qué es lo que esta comparando en la primera función cuando decimos "Si a1 = a2"?.

Ahora vayamos con Python.  

#!/usr/bin/env python3

# Ejercicio 1 Tema 1. Python Fácil

""" Cree una función que determine si dos listas son iguales.
Dos listas son iguales si tienen la misma longitud y sus elementos en cada indice
son iguales"""


def listasiguales1(l1, l2):    
    if len(l1) == len(l2):              
        for i in range(len(l1)):
            if l1[i] != l2[i]:
                return False                
    return True

def listasiguales2(l1, l2):
    if len(l1) == len(l2) and l1 == l2:
        return True
    else:
        return False

def main():
    lista1 = [1, 2, 3]
    lista2 = [1, 2, 3]
    # lista2 = [4, 6, 1]
    print (listasiguales1(lista1, lista2))
    print (listasiguales2(lista1, lista2))

if __name__=='__main__': main()
 


Salida:
Citar:

True
True


¿ Existe otra posibilidad en gambas ?.
Puede que una lista de Python no sea tan parecido a un array dinámico de gambas. Aunque se parecen bastante.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Domingo, 18 Marzo 2018, 12:14; editado 3 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays 
 
Quise decir array dinámico que es algo distinto. El array dinámico o matriz nativa de gambas si se parece a una lista de Python.  
Voy a cambiar el titulo.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
Ahora supongamos que si no existe un método de comparación de arrays dinámicos en gambas, me lo creo yo mismo
en una nueva clase que hereda de Variant[]

Inherits Variant[]

'' Compara dos arrays
Public Sub Compare(a2 As Variant[])
  
  Dim i As Integer  
  Dim iguales As Boolean
  
  If Me.Length = a2.Length Then  
    For i = 0 To Me.Max
      If Me[i] <> a2[i] Then iguales = False
      Break
    Next
    iguales = True
  Endif
  
  Print iguales
  
End
 


Public Sub Main()
  
  Dim anumeros1 As New NuevaArray
  Dim anumeros2 As New NuevaArray
  
  anumeros1.Add(2)
  anumeros1.Add(3)
  
  anumeros2.Add(2)
  anumeros2.Add(3)
  
  anumeros1.Compare(anumeros2)
  
End

 


¿ Cabe esa posibilidad o es muy mejorable ?

No puedo crear el array de esta forma:

Private anumeros1 As NuevaArray = [1, 2]
 


Ya que anumeros1 espera datos del tipo NuevaArray y obtiene Integer[].
"Casi" parece una igualación.  

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Martes, 20 Marzo 2018, 09:42; editado 5 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
No es más que una subclase de la clase Variant[] .  

Al igual que podríamos heredar de la clase String y comprobar si nuestra palabra es un palíndromo o un anagrama.  
La cosa es añadir métodos nuevos a los que ya tenemos. Eso si, bien hechos.

Ya seria "un peccato" cambiar la clase original. Me excomulgan!.  
Modificar el gambas original y crear otro distinto.  

Que por cierto. ¿ gambas no usa método especiales para detectar la suma, la resta ..(cosas así ) ?.

Algo como esto en Python:

__add__, se invoca con a + b, a += b
__le__ , se invoca con a <= b

Si, dije invocar..como a los demonios!.  

Bastaría con sobrecargar el método para liarla parda!.  

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
Shell escribió: [Ver mensaje]
¿ Por que gambas no es capaz de comparar dos arrays directamente ?

Si quieres un nuevo especifico Método, tienes que pedirlo a... monsieur Minisini.  



Shell escribió: [Ver mensaje]
¿ Qué es lo que esta comparando en la primera función cuando decimos "Si a1 = a2"?.

Substancialmente dos dirección de memoria de los Objetos array.

Public Sub Main()
  
  Print ComparaArray1([1, 2], [1, 2])
  
End


Public Sub ComparaArray1(a1 As Integer[], a2 As Integer[])

  Print a1, a2

End




Shell escribió: [Ver mensaje]
Ahora vayamos con Python.



Domine noster, libera nos ab omni malo !!!



Shell escribió: [Ver mensaje]
Si, dije invocar..como a los demonios!

...es decir: Python !  
 



 
última edición por vuott el Domingo, 18 Marzo 2018, 17:09; editado 2 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
...y más, si tú deseas una verificación más detallada, puedes comparar los individuales datos contenidos por las áreas de memoria de los correspondientes array.

Solo un simple ejemplo:
Public Sub Main()
  
  ComparaArray1([1111, 222222], [1111, 222222])
  
End


'' Compara dos arrays
Public Procedure ComparaArray1(a1 As Integer[], a2 As Integer[])

  Dim i As Integer
  
   Print Null, "a1", "a2\n------------------"
   For i = 0 To (a1.Count * SizeOf(gb.Integer)) - 1
     Print i, Hex(Byte@(a1.Data + i), 2), Hex(Byte@(a2.Data + i), 2)
   Next
  
End

 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
vuott escribió: [Ver mensaje]
...comparar los individuales datos contenidos por las áreas de memoria de los correspondientes array.

Analogamente podemos utilizar la función " Comp( ) ":

Public Sub Main()

  Dim ii1, ii2 As Integer[]
  Dim i As Integer
  
   ii1 = [1111, 222222]
   ii2 = [1111, 222222]
  
   i = Comp(CStr(Pointer@(ii1.Data)), CStr(Pointer@(ii2.Data)))
   Print IIf(i == 0, "iguales", "diferentes")

End



Si te gustan las funciones externas, podemos usar la función " memcmp( ) ", que compara dos áreas de memoria reservadas:
Library "libc:6"

' int memcmp (const void *__s1, const void *__s2, size_t __n)
' Compare N bytes of S1 and S2.
Private Extern memcmp(__s1 As Pointer, __s2 As Pointer, __n As Long) As Integer


Public Sub Main()

  Dim ii1, ii2 As Integer[]
  Dim i As Integer
  
   ii1 = [1111, 222222]
   ii2 = [1111, 222223]
  
   i = memcmp(ii1.Data, ii2.Data, (ii1.Count * SizeOf(gb.Integer)))

   Print IIf(i == 0, "iguales", "diferentes")

End

 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
Hola Vuott!.

Citar:

Si quieres un nuevo especifico Método, tienes que pedirlo a... monsieur Minisini.


Debería de haber un lugar donde los usuarios de gambas manden códigos  que crean que pueden
ser importantes para agregar a gambas. Allí Benoit pueda ver por orden de importancia y añadirlo
o no, según convenga. Dando una explicación si el quiere, del motivo por el cual no lo ve tan
importante o al revés.

Cuando tu dices que lo que compara son dos direcciones de memoria:

Si tuviéramos: dirección, contenido o valor guardado. Podíamos estar hablando de una "sola variable"
En el caso de un array que contiene distintos valores. No estaríamos hablando de una sola dirección,
ya que cada dirección de memoria tiene un solo valor. Estaríamos hablando de distintas direcciones de memoria.
¿ Me equivoco ?.  Entonces supongo que a cada valor del array:

¿ Las direcciones de memoria son continuas ?. (Una detrás de la otra). ¿ O se asignan al azar ?.
Veo raro una sola dirección y todo los datos ahí.  

Citar:

...y más, si tú deseas una verificación más detallada, puedes comparar los individuales datos contenidos por las áreas de memoria de los correspondientes array.


Malvados y enrevesados punteros!.  

Tuve en mente dos funciones, pero no les veía una posibilidad para poder hacerlo: Data y Comp.

¿ Cómo es que usas como valor final para el bucle esto ?:

For i = 0 To (a1.Count * SizeOf(gb.Integer)) - 1
 


Lo veo algo complicado de entender. ¿ No te vale solo con a1.Count ?.  

Citar:

Analogamente podemos utilizar la función " Comp( ) ":


Cierto, pero como vi que hacía referencia a valores de cadena, no le vi posibilidad con números.

Citar:

Si te gustan las funciones externas, podemos usar la función " memcmp( ) ", que compara dos áreas de memoria reservadas:


Herejía!.  

Es muy probable que esto es lo que este haciendo realmente a un nivel más "bajo". ( no digo malo ).
Como ves has simplificado "mucho" el código. Pero eso puede tener un precio, el uso de una librería añadida
y ademas un código que los programadores de "basic" no estamos acostumbrados a ver y a usar.

Volviendo al código de gambas parecido al de Python. La sencillez del código es enorme.
No se ha usado un bucle y se ha ido directamente a lo que pide el enunciado del problema
y sus condiciones.

'' Compara dos arrays
Public Sub ComparaArray1(a1 As Integer[], a2 As Integer[]) As Boolean
'No funciona

If a1.Count = a2.Count And a1 = a2 Then
Return True
Else
Return False
Endif

End
 


El interprete de Basic en esa comparación de dos arrays, debe de comprender que no se están
comparando dos valores solamente y que es un array cada uno de esos valores a comparar.
( Ya, ya se que son direcciones de memoria ).

Por lo tanto al "invocar" o llamar ese método especial interno del interprete de gambas mediante " = ".
El debe "conocer" que "se comprara". Dos valores enteros, dos grupos de valores...etc.

Si los valores son del tipo "x" hacer esto,
Si los valores son del tipo "y" hacer lo otro,
etc, etc..

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
vuott escribió: [Ver mensaje]
vuott escribió: [Ver mensaje]
...comparar los individuales datos contenidos por las áreas de memoria de los correspondientes array.

Analogamente podemos utilizar la función " Comp( ) ":

Public Sub Main()

  Dim ii1, ii2 As Integer[]
  Dim i As Integer
  
   ii1 = [1111, 222222]
   ii2 = [1111, 222222]
  
   i = Comp(CStr(Pointer@(ii1.Data)), CStr(Pointer@(ii2.Data)))
   Print IIf(i == 0, "iguales", "diferentes")

End



Si te gustan las funciones externas, podemos usar la función " memcmp( ) ", que compara dos áreas de memoria reservadas:
Library "libc:6"

' int memcmp (const void *__s1, const void *__s2, size_t __n)
' Compare N bytes of S1 and S2.
Private Extern memcmp(__s1 As Pointer, __s2 As Pointer, __n As Long) As Integer


Public Sub Main()

  Dim ii1, ii2 As Integer[]
  Dim i As Integer
  
   ii1 = [1111, 222222]
   ii2 = [1111, 222223]
  
   i = memcmp(ii1.Data, ii2.Data, (ii1.Count * SizeOf(gb.Integer)))

   Print IIf(i == 0, "iguales", "diferentes")

End


muy buena
 



 
tercoIDE - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Comparar Dos Arrays Dinámicos O Nativos 
 
Shell escribió: [Ver mensaje]
Si tuviéramos: dirección, contenido o valor guardado. Podíamos estar hablando de una "sola variable"
En el caso de un array que contiene distintos valores. No estaríamos hablando de una sola dirección,
ya que cada dirección de memoria tiene un solo valor. Estaríamos hablando de distintas direcciones de memoria.
¿ Me equivoco ?.  Entonces supongo que a cada valor del array:

Cada dato (8 bit = 1 byte) ocupa una celda de memoria, y cada celda de memoria tiene su propia dirección. Pero los datos, que pertenecen a un único grupo (de mismo o de diferentes tipos), son guardados en memoria en manera continua.
Puedes comparar todo eso a los datos guardados en un file.
Como son guardados los datos en un file ?
Si nunca lo viste, te exhorto a abrir un archivo con un editor hexadecimal.

Pues sabiendo que un valor de tipo entero ocupa SizeOf(gb.Integer) byte de memoria, en un array - que tiene por ejemplo 2 elementos - estos elementos ocuparán 2 * SizeOf(gb.Integer) byte de memoria de manera proxima y consecutiva.



Shell escribió: [Ver mensaje]
¿ Las direcciones de memoria son continuas ?. (Una detrás de la otra). ¿ O se asignan al azar ?.

Continuas.
En efecto es posible desplazarse a lo largo de los byte de la memoria, o sea a lo largo de las direcciones (celdas, byte) de la memoria, través de la así llamada "Aritmética de los Punteros".



Shell escribió: [Ver mensaje]
¿ Cómo es que usas como valor final para el bucle esto ?

Ya que nosotros averiguaremos byte por byte la memoria ocupada por los valores contenidos por el array, tenemos que considerar el numero de elementos del nuestro array multiplicado por la cantidad de byte (celdas) de memoria ocupada por el tipo Entero.
 



 
última edición por vuott el Lunes, 19 Marzo 2018, 13:26; editado 5 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Acerca De Arreglos Dinámicos De Clases De... santijav Controles/Librerías/Componentes 1 Lunes, 30 Diciembre 2013, 22:28 Ver último mensaje
jsbsan
No hay nuevos mensajes Leer Md5 De Gamba Y Comparar Con Md5 De Php nelsondiaze Aplicaciones/Fragmentos de Código 1 Martes, 13 May 2014, 21:04 Ver último mensaje
jsbsan
No hay nuevos mensajes Mostrar Arrays Dentro De Otro Arrays Shell General 9 Domingo, 07 Diciembre 2014, 20:30 Ver último mensaje
Shell
No hay nuevos mensajes ¿Que Código Pongo Para Usar El Observado... gambafeliz General 4 Martes, 27 Agosto 2019, 13:15 Ver último mensaje
gambafeliz
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron