|
Página 1 de 2
|
Comparar Dos Arrays Dinámicos O Nativos
Autor |
Mensaje |
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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.
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
|
#1 Domingo, 18 Marzo 2018, 11:53 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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"
|
#2 Domingo, 18 Marzo 2018, 12:11 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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[]
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:
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
|
#3 Domingo, 18 Marzo 2018, 13:46 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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"
|
#4 Domingo, 18 Marzo 2018, 14:11 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Comparar Dos Arrays Dinámicos O Nativos
¿ Por que gambas no es capaz de comparar dos arrays directamente ?
Si quieres un nuevo especifico Método, tienes que pedirlo a... monsieur Minisini.
¿ 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.
Ahora vayamos con Python.
Domine noster, libera nos ab omni malo !!!
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
|
#5 Domingo, 18 Marzo 2018, 15:38 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
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
|
#6 Domingo, 18 Marzo 2018, 18:30 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Comparar Dos Arrays Dinámicos O Nativos
...comparar los individuales datos contenidos por las áreas de memoria de los correspondientes array.
Analogamente podemos utilizar la función " Comp( ) ":
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
|
#7 Lunes, 19 Marzo 2018, 02:31 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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 ?:
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.
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"
|
#8 Lunes, 19 Marzo 2018, 10:27 |
|
|
tercoIDE
Analista Programador
Registrado: Noviembre 2013
Mensajes: 713
Edad: 54
|
Re: Comparar Dos Arrays Dinámicos O Nativos
...comparar los individuales datos contenidos por las áreas de memoria de los correspondientes array.
Analogamente podemos utilizar la función " Comp( ) ":
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
|
#9 Lunes, 19 Marzo 2018, 12:07 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Comparar Dos Arrays Dinámicos O Nativos
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.
¿ 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".
¿ 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
|
#10 Lunes, 19 Marzo 2018, 13:11 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 2
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
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
|
|
|
|
|