VB6: Ayuda con evaluación de expresiones matemáticas

Publicado por elcalez, Octubre 07, 2008, 15:22:45

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

elcalez

Cita de: Predicador en Octubre 14, 2008, 14:05:11
Perdon, te habia entendido mal el tema del is_id, variable la cual tiene mas pinta de ser Booleana que la mismisima hija de George Boole :P

Jaja, es bien Bul la guacha! Había probado en definirla como Booleana pero me tiraba error porque no se sacaba los "%".
PERFECTO. No jodo más. Muy interesante el código (lo digo por milésima vez, pero no encontré mucho en google y con el link que pasaste más las mejoras, ojalá que les sirva a algunos).

Salud y saludos!

Predicador

Cita de: elcalez
El error de la división lo capturé (juro que antes de ver tu mensaje!) así:
No me referia a la division por cero per se (ya que si hay una division por cero el mismo visual basic la detecta), sino al hecho que en el IF sea la condicion falsa o verdadera, se evaluan ambas expresiones en el IF. Lo que deberias modificar es que se evalue solo la expresion corresponiente.
Lo que implica:
   ' *************** Gramatica del IF
   ' Agregado por Predicad0r
   ElseIf e_tok = "if" Then
      Call e_nxt
      Call e_match("(")
      tr = e_prs(1)
      Call e_match(";")
     
      If tr Then  ' IF true
                 n = e_prs(1)
                 Call e_match(";")
                 'z = e_prs(1)   ' en vez de evaluar la segunda condicion innecesariamente
                 Call e_skip(")") ' la salteamos hasta que cierra el parentesis
                 
      Else  ' IF flase Se evalua la segunda expresion
                 'z = e_prs(1)   ' en vez de evaluar innecesariamente
                 Call e_skip(";") ' salteamos hasta la posicion de la segunda expresion
                 Call e_match(";")
                 n = e_prs(1)
      End If
      Call e_match(")")
   ' *************** fin IF

donde:
' Saltea caracteres hasta que encuntra until_ch
' controla que los parentesis esten balanceados por si until_ch es un parentesis
' By Predicador
Sub e_skip(until_ch As String)
   parentesis = 0
   e_tok = Left$(e_input, 1)
   Do While ((e_tok <> until_ch) Or (parentesis > 0)) And e_input <> ""
      If e_tok = "(" Then parentesis = parentesis + 1
      If e_tok = ")" Then parentesis = parentesis - 1
      e_input = Mid$(e_input, 2)
      e_tok = Left$(e_input, 1)
   Loop
   e_input = Mid$(e_input, 2)
End Sub

Baii
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

elcalez

Quedó bárbaro. No sabía como salir del if de tr (hacer el corte cuando evalúa una y otra condición), te entendí lo que planteaste (que si la primer condición es verdadera, no evalúe la segunda) pero como te dije, entraba tantas veces en la function e_prs que me perdí. No se me ocurrió poner otra función, pero evidentemente es la mejor solución. Lo de la división por cero, tampoco se me ocurrió capturar el error del VB y lo hice directamente con un mensaje personalizado.
El código realmente superó mis espectativas. Que vocación que tenés Predicador, realmente admirable (no digo sana envidia porque la envidia nunca es sana)  :up:

Gracias!