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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  vb6 es tonto
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: vb6 es tonto  (Leído 5,115 veces)
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
vb6 es tonto
« en: 2 Octubre 2011, 01:08 am »

Hola chicos, bueno a raíz de una discusión con la profesora de programación he investigado sobre los Ifs de vb6... :rolleyes:

En esta situación:
Código
  1. If A = True Or B = False Then
Lo lógico sería que al leer A=True no comprobara Lo siguiente puesto que la condición se cumpliría de todas formas. :)
Pero no, vb te comprueba TODO el If pase lo que pase en todos los casos. :¬¬

Aquí un código que lo demuestra:

Código
  1. Option Explicit
  2.  
  3. Private Function OrTest(ByVal bReturn As Boolean) As Boolean
  4.    '// Imprimo un texto para saber que he pasado por la función.
  5.    Debug.Print Time$, "Función con el argumento " & bReturn & " llamada."
  6.    OrTest = bReturn
  7. End Function
  8.  
  9. Private Sub Form_Load()
  10.  
  11.    '// Aquí lo logico sería comprobar las dos ya que
  12.    '// si la primera no es true, lo puede ser la segunda.
  13.    If OrTest(False) Or OrTest(False) Then
  14.        '// Nothing
  15.    End If
  16.  
  17.    Debug.Print String$(75, "=")
  18.  
  19.    '// Lo lógico sería que se saltase la segunda función puesto
  20.    '// que la primera es true, pero no, nuestro querido vb
  21.    '// comprueba igual...
  22.    If OrTest(True) Or OrTest(False) Then
  23.        '// Nothing
  24.    End If
  25. End Sub
  26.  

Retorno:
Código:
00:27:48      Función con el argumento Falso llamada.
00:27:48      Función con el argumento Falso llamada.
===========================================================================
00:27:48      Función con el argumento Verdadero llamada.
00:27:48      Función con el argumento Falso llamada.


Sé que alguno dirá: ¿y a mí qué más me da si el resultado es el mismo?
Bueno, pues imagina que tienes un If tal que así:

Código
  1. If Calculo(1) Or Calculo(2) Or Calculo(3) Or Calculo(4) Or Calculo(5) Then
  2.    '...
  3. End If
La función Calculo() es un algoritmo complejo y tarda 1 segundo de media.
Si fuera otro lenguaje de programación si Calculo(1) es true se saltaría los demás, pero nuestro querido vb6 llamará a todas las demás funciones perdiendo tiempo innecesariamente... :-\ Pasando de 1 seg a 5 en este caso.
La alternativa que propongo en estos casos es (no son agradables a la vista, aviso :xD) :

Sustituir esto:
Código
  1.    If A(324) = 45 Or B(12) = 2 Or B(4563) = 56 Then
  2.        Call DoIt
  3.    End If

Por esto:
Código
  1.    If A(324) = 45 Then
  2.        Call DoIt
  3.    ElseIf B(12)=2 Then
  4.        Call DoIt
  5.    ElseIf B(4563) = 56 Then
  6.       Call DoIt
  7.    End If

Esto:
Código
  1.    If A(324) = 45 And B(12) = 2 And B(4563) = 56 Then
  2.        '...
  3.    End If

Por esto:
Código
  1.    If A(324) = 45 Then
  2.        If B(12) = 2 Then
  3.            If B(4563) = 56 Then
  4.                '...
  5.            End If
  6.        End If
  7.   End If
Con esto no quiero decir que lo hagáis así de normal, sólo cuando necesitemos velocidad.
Hice estas pruebas a ver si algún lenguaje más era tonto, pero por ahora sólo es vb6.
Si alguien sabe de otro hacedmelo saber, me interesa mucho.
Dedico este articulo a Karcrack, BlackZero, TheSwash y raul338 por orientarme y ayudarme con los test.

VB.NET tiene una expresion para evitar esto:
Código:
Short-Circuiting Logical Operations http://msdn.microsoft.com/en-us/library/wz3k228a.aspx

Más info:
Código:
http://en.wikipedia.org/wiki/Short-circuit_evaluation

Espero que al menos a alguien le sirva todo esto. :)

DoEvents! :P


« Última modificación: 2 Octubre 2011, 01:14 am por Psyke1 » En línea

$Edu$


Desconectado Desconectado

Mensajes: 1.842



Ver Perfil
Re: vb6 es tonto
« Respuesta #1 en: 2 Octubre 2011, 01:18 am »

No sabias esto de antes? :S hasta yo lo sabia xD

En .net por ejemplo ya tienes opcion, si quieres un "Or" comun como en vb6 o un "Or" mas "rapido" que saldra si ya no cambiara en nada las siguientes condiciones con el final.

Te da para elegir porque a veces aunque la condicion final no cambiara, necesitamos que entre a una funcion que mostrara talvez un mensaje de error.


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: vb6 es tonto
« Respuesta #2 en: 2 Octubre 2011, 01:26 am »

.
Es BlackZeroX... no BlackZero ¬¬"

Lo probaste compilado?...

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
79137913


Desconectado Desconectado

Mensajes: 1.169


4 Esquinas


Ver Perfil WWW
Re: vb6 es tonto
« Respuesta #3 en: 2 Octubre 2011, 01:33 am »

HOLA!!!

Es cierto, Pero no es noticia :S

Cuento viejo...

Pero... proba compilando en Otros modos de compilacion.

GRACIAS POR LEER!!!
En línea

"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

 79137913                          *Shadow Scouts Team*
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: vb6 es tonto
« Respuesta #4 en: 2 Octubre 2011, 01:44 am »

Sí, probé compilado. :P
Yo también sabía esto de hace tiempo, pero ingenuo de mí, llegué a pensar que en todos los lenguajes era igual. :laugh:
Y la gente que no programa en vb6 no lo suele saber, así que no creo que esto haya sido 100% en vano.

DoEvents! :P
« Última modificación: 2 Octubre 2011, 01:47 am por Psyke1 » En línea

Yoghurt

Desconectado Desconectado

Mensajes: 122


Si alguien se molesto en escribir, justo es leer.


Ver Perfil WWW
Re: vb6 es tonto
« Respuesta #5 en: 8 Octubre 2011, 00:27 am »

No han escuchado por ahí o leído de que VB comprueba desde la izquierda hacia la derecha??

Por ejemplo en:
If (A=True) Or (B=False) Then ...

Comprueba si B=False y Luego si A=True. Eso lo tengo en mi memoria hace unos años que leí eso. Aunq me da flojera comprobarlo, ahora que salió el tema a la "parrilla" :)

P.D.: Siempre se ha sabido de las falencias de la Microsoft con Todos sus productos, aunq ya deberían saberlo y da risa cuando sale uno alegando por los defectos =D
En línea

$Edu$


Desconectado Desconectado

Mensajes: 1.842



Ver Perfil
Re: vb6 es tonto
« Respuesta #6 en: 8 Octubre 2011, 16:29 pm »

Eso si q no xD, lee de izquierda a derecha es decir primero A y luego B, y esto que se habla aca no son "defectos" sino que no tiene la capacidad de elegir cuando usar And comun y cuando no, en cambio vb.net si lo tiene.

Con este codigo se van todas las dudas.

Código
  1. Private Sub Form_Load()
  2. If (EnLinea("Nestor")) And (EnLinea("edu")) Then
  3. MsgBox "Imposible que aparezca este mensaje!"
  4. End If
  5. End Sub
  6.  
  7. Private Function EnLinea(ByVal contacto As String) As Boolean
  8.  
  9. If contacto = "edu" Then
  10.    MsgBox "Edu siempre esta online xD" ' entonces da true
  11. Else
  12.    MsgBox "No esta conectado!"
  13.    Exit Function
  14. End If
  15.  
  16. EnLinea = True
  17.  
  18. End Function
  19.  
En línea

Sanlegas

Desconectado Desconectado

Mensajes: 131


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


Ver Perfil
Re: vb6 es tonto
« Respuesta #7 en: 8 Octubre 2011, 21:39 pm »

Me imagino que ha de comprobar las demas condiciones por si hay otro operador logico que pueda comprobar, como un XOR, ejemplo:

Código
  1. Option Explicit
  2.  
  3. Private Function OrTest(ByVal bReturn As Boolean) As Boolean
  4.    '// Imprimo un texto para saber que he pasado por la función.
  5.    Debug.Print Time$, "Función con el argumento " & bReturn & " llamada."
  6.    OrTest = bReturn
  7. End Function
  8.  
  9. Private Sub Form_Load()
  10.  
  11.    '// Aquí lo logico sería comprobar las dos ya que
  12.    '// si la primera no es true, lo puede ser la segunda.
  13.    If OrTest(False) Or OrTest(False) Then
  14.        '// Nothing
  15.    End If
  16.  
  17.    Debug.Print String$(75, "=")
  18.  
  19.    If OrTest(True) Or OrTest(False) Xor OrTest(True) Then
  20.        Debug.Print "OK!"
  21.        '// Nothing
  22.    End If
  23. End Sub

Como dicen ustedes con la primera comparación tendria que salirse e imprimir "OK!", pero como el XOR da false no lo imprime, salu2 !
« Última modificación: 9 Octubre 2011, 06:23 am por Tenient101 » En línea

seba123neo
Moderador
***
Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: vb6 es tonto
« Respuesta #8 en: 8 Octubre 2011, 23:07 pm »

No sabias esto de antes? :S hasta yo lo sabia xD

En .net por ejemplo ya tienes opcion, si quieres un "Or" comun como en vb6 o un "Or" mas "rapido" que saldra si ya no cambiara en nada las siguientes condiciones con el final.

AndAlso y OrElse en .NET son operaciones cortocircuitadas, asi como el operador ternario de java "?"
En línea

$Edu$


Desconectado Desconectado

Mensajes: 1.842



Ver Perfil
Re: vb6 es tonto
« Respuesta #9 en: 9 Octubre 2011, 15:00 pm »

Gracias seba, y Tenient.. el mensaje "OK!" saldra SOLAMENTE si el la condicion es verdadera, y como dices es falsa entonces obvio que no entra, lo que estamos diciendo es que sea True o False la condicion, pasara uno por uno, en este caso tiene que mirar todos obligado por el xor que pusiste pero deciamos en caso como if true or true or true or true or true or true or true..., con el primero ya da True la condicion y no necesitaria comprobar todos los otros, pero si lo hace, pero en .net como dice seba existe el OrElse que no va a verificar el resto de las condiciones ya que no cambiaran el resultado.
En línea

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
algo muy tonto
Sugerencias y dudas sobre el Foro
sakio 5 2,460 Último mensaje 7 Septiembre 2005, 13:27 pm
por Za3LoT
Problema tonto pero tonto...
Sugerencias y dudas sobre el Foro
leucocito 7 4,093 Último mensaje 18 Noviembre 2009, 14:36 pm
por [u]nsigned
Problema tonto
PHP
Feedeex 2 2,880 Último mensaje 12 Mayo 2011, 13:48 pm
por Feedeex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines