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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Funcion que devuelve multiples resultados
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Funcion que devuelve multiples resultados  (Leído 1,941 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Funcion que devuelve multiples resultados
« en: 15 Septiembre 2019, 05:26 am »

Hola, mi duda es como utilizar esta función personalizada que me dieron en el cole,

Código
  1. Function DevolverEncontrados(ByVal vector As Variant) As Variant
  2.  
  3. Dim i As Long, mat
  4. Dim j As Long
  5. Dim cant As Long
  6. Dim aux As Long
  7.  
  8. cant = UBound(vector)
  9. aux = 0
  10. For i = 1 To cant
  11. If VarType(vector(i, 1)) <> vbBoolean Then
  12. aux = aux + 1
  13. End If
  14. Next i
  15.  
  16. ReDim mat(1 To aux, 1 To 1)
  17. j = 1
  18. For i = 1 To cant
  19. If VarType(vector(i, 1)) <> vbBoolean Then
  20. mat(j, 1) = vector(i, 1)
  21. j = j + 1
  22. End If
  23. Next i
  24.  
  25. DevolverEncontrados = mat
  26.  
  27. End Function


Tengo una tabla de partidos de futbol de todos los mundiales
Tengo dos valores de consulta que ingreso yo, año y seleccion de futbol(Pais)

Y bueno se supone que con esos dos datos y esta funcion me tiene que rellenar una matriz con todos los jugadores de esa seleccion, mostrandome 3 campos con los siguientes datos nombre jugador, posicion y cantidad de goles pero la verdad no entiendo, luego tengo que hacer lo mismo con una función sin utilizar el codigo de Visual Basic :shock:


En línea

7w7
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Funcion que devuelve multiples resultados
« Respuesta #1 en: 15 Septiembre 2019, 16:13 pm »

De entrada la función es una función abstracta, es decir hace un filtrado de elementos sin necesidad de saber cual es el contenido de aquellos elementos, más allá de saber que al parecer aloja (al menos) dos tipos de datos, rechazando aquellos que son de tipo buleano.

Por otro lado el código es bastante sucio...

En VB6 un variant es un tipo que en principio puede contener a cualquier otro tipo, incluso un array del propio tipo variant, más aún podría contener una colección del tipo que sea u ocultar todo un árbol...
...por lo que el uso (correcto) de la función requiere en gran medida saber qué datos son los que recibe la función de otro modo es fácil incurrir en errores.
Una ventaja del tipo Variant es que relaja el chequeo de tipos, lo que lo hace apto para ser usado en funciones que precisen ser tratadas por igual sin distintición del tipo de datos (esto es, no exige así, disponer de una función de ídéntica funcionalidad para tratar otro tipo de datos, solo por tratarse de un tipo distinto. Resulta incómodo esos lenguajes que fuerzan a hacer por ejemplo una función sort(), para cada tipo de datos que se quiera ordenar: una para ordenar arrays de bytes, otra para arrays de cadenas, otra para arrays de enteros, etc...).

La función además de sucia adolece de alguna imprecisión que puede incurrir en error, por ejemplo al asumir que el vector comienza en el índice 1. Así sería más correcto cambiar la firma de los bucles desde:
Código
  1. for i = 1 to cant
a una más precisa:
Código
  1. dim inicio as long
  2. '...
  3. inicio = LBound(vector)
  4. '...
  5. for i = inicio to cant

Esto excluye posibles errores en vectores cuyo índice no comience en 1. Salvo que se se tenga la absoluta certeza de que siempre comienzan en 1...
Debe notarse que en VB6, un array admite cualquier valor en el subíndice inicial, mientras que muchos lenguajes lo fijan a 0 ó incluso 1 (como pasa en varias versiones de Fortran).

El redimensionamiento del array 'mat', no tiene sentido que sea de dos dimensiones cuando en una dimensión solo habrá un elemento.
Pero claro, tampoco puede alegarse que esté mal, por que en vb6 un array puede ser redimensionado posteriormente conservando su contenido, pero en tal caso, sólo con la última dimensión. ...luego, si fuera de la función (en otra parte del código desde el que se llama) se lleva a cabo tal redimensionado tendría validez, aunque discutida, pués hay maneras más eficaces de llevarlo a cabo pero sobre todo por eficiencia, pués nada impide pasar un segundo o tercer parámetros para indicar la dimensión e índice.
Todavía otro asunto más espinoso es que el array parece ordenado por columnas en vez de por filas, una vez más como digo tiene validez si fuera se ha de redimensionar y asignar después otros arrays...
(para que se entienda mejor, lo propio es dimensionar por filas así:
Código
  1. redim mat(1 to 1, 1 to aux)
  2.  
...lógicamente acorde a la declaración en el resto del código debe igualmente ser intercambiado de lugar las variables acorde a que apunten a cada dimensión correctamente.)

En definitiva el código es muy sucio y a buen seguro que teniendo el resto del código del que forma parte de lo que sea que se pretende hacer, acepta sí o sí lugar a mucha optimización.

En cuando al código, lo que hace es...
1 - En el primer bucle localiza que elementos del array no son de tipo buleano, con el único propósito de contarlos.
2 - Cuando termina dicho bucle usa ese valor de cuenta (conoce cuantos elementos hay que no son buleano), para dimensionar (alojar memoria para) un array con dicho número de elementos (mat).
3 - Luego en el segundo bucle, se localiza los mismos elementos contados en el primero, pero ahora con el propósito de ser asignados al nuevo array... secuencialmente.

El resultado es que procedente de un array de entrada con valores que tiene buleanos y otros tipos de datos (no se entra en que otros tipos de datos puedan ser), se filtra para devolver otro array que contienee exclusivamente todos aquellos elementos que no son de tipo bucleano. El primer bucle es necesario porque a priori se desconoce cuantos son buleanos y cuantos de otro/s tipo/s. Lo que se vaya a hacer después con dichos datos, nada se sabe.

Sobre lo que dices que hace el código (completo) que te hallan pasado, en principio no puede afirmarse, ni negarse nada, sin conocer los datos u otro código adicional, porque la función como te he indicado es de naturaleza abstracta, solo puede afirmarse de ella que filtra elementos de tipo buleanos (sin saber (ni necesitarlo para hacerlo) qué otros tipos contiene).


Un array de variants puede contener elementos heterogéneos. Por ejemplo:
Código
  1. dim x() as variant    ' define que que x es un array dinámico con elementos individuales variant.
  2. dim by as byte, bo as boolean
  3. dim j as integer, k as integer
  4. dim s as string
  5. dim img as IpictureDisp
  6.  
  7. by= 255
  8. bo = TRUE
  9. j =18765: k = (j\by)
  10. s = "Hola"    ' asignado un simple string...
  11. s = Dir("C:\windows\web\wallpaper\*.jpg")    ' ahora asignado la ruta de una imagen jpg (si existen en esa carpeta imágenes jpg, toma la primera).
  12. set img = loadpicture(s)
  13.  
  14. ' alojando espacio en memoria para 100 elementos de tipo variant para el array x
  15. redim x(0 to 99)  
  16. ' Asignación a los elementos del array, diferentes tipos (heterogéneos), como ejemplo.
  17. x(0) = by
  18. x(1)= bo
  19. x(2) = j
  20. x(3) = k
  21. x(4) = s
  22. set x(5) = img
  23.  
  24. msgbox x(4)        ' la ruta de la imagen... con el nombre dle fcihero.
  25. msgbox "el valor del índice 3 del array x, es: " & x(1)     ' True
  26. msgbox cstr(x(3))    ' el integer asignado a la posición 3, que lo convertimos a un string para su presentación
  27. ' (la conversión no es requerida persé. ...se hace una conversión explícita del tipo integer a string, cuando el tipo esperado a la derecha (en la asignación) es de tipo string y el de la izquierda (el resultado de la expresión) es de tipo numérico).
  28.  
Al igual que en cualquier otro lenguaje el uso de tipos variants (tipos universales, un tipo que puede actuar, representar o comportarse como otro), sale costoso, esto es especialmente más cierto en vb6 que en otros lenguajes por la forma en que se aborda, y son la solución equivalente a las uniones disponibles en otros lenguajes, como ADA por ejemplo.

Si tienes alguna duda a cualquier respecto, pregunta...


« Última modificación: 15 Septiembre 2019, 16:28 pm por NEBIRE » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
funcion que devuelve un caracter
Programación C/C++
mapers 5 3,469 Último mensaje 16 Agosto 2010, 07:49 am
por leogtz
Ayuda con función que devuelve substring
Programación C/C++
Shon 0 2,544 Último mensaje 19 Septiembre 2010, 20:06 pm
por Shon
Agregar múltiples resultados
PHP
CoolTesting 1 1,453 Último mensaje 15 Marzo 2014, 02:52 am
por engel lex
[DUDA] ¿Porque la función math me devuelve resultados erroneos?
Java
JollyRoyer 3 2,535 Último mensaje 5 Marzo 2015, 18:54 pm
por Usuario Invitado
Función que devuelve número repeticiones
Programación C/C++
Palante 4 2,422 Último mensaje 13 Febrero 2017, 20:12 pm
por naidmen
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines