Programación General > Visual Basic 6.0 e inferiores
1 != 1 ??
(1/1)
Epa:
Buenas gentem tengo un problemita con una comparacion que me comio la cabeza varias horas y no logro entender cual es el problema.
Desde un timer se llama a una funcion q contiene ese codigo varias veces.
el problema es que Speed tiene el valor de 0.1, por lo que logicamente luego de 10 veces Movement tomara el valor de 1. sin embargo cuando toma ese valor pasa por alto el primer if hasta q Movement toma el valor de 1.1
--- Código: Text --- If 1 = Int(Movement) Then Movement = 0 actMov = D_NONE lastMov = D_NONE Look = Act_Look + L_SOUTH Else posY = posY + Speed Movement = Movement + Speed End If
ya he intentado hacer un cast con Movement a una variable de tipo integer, crear una constante de valor 1 para la comparacion, de tipo entero y de tipo con coma flotante, compararlo de ambas maneras, pero no logro entender cual es el problema.
agregue al final de la funcion Debug.Print Movement y este el es resultado:
--- Código: Text --- 0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1 1,1 0
Agradeceria enormemente cualquier ayuda.
Desde ya muchas gracias, saludos
cpmario:
Por favor coloca el código con el que defines las variables. Lo que parece estar fallando es que la expresión int( Movement) no tenga exactamente el valor de 1
El siguiente código si funciona:
--- Código: Text ---Option Explicit Dim Movement As SingleConst Speed As Single = 0.1 Private Sub Timer1_Timer() If 1 = Int(Movement) Then Movement = 0 Else Movement = Movement + Speed End IfEnd Sub
Epa:
Buenas, aqui pongo un poco mejor, el codigo.
Acabo de intentarlo con variables de tipo single, pero se pierde demasaiada precision, y necesito q sea todo exacto. Y Speed es una variable, no una constante, ya que puede variar dependiendo unas cosas.
Timer
--- Código: Text --- Private Sub tmrMove_Timer() nx = posX[CODE]ny = posY With m_InputIf actMov = D_NONE Then If (.Key(Key_RControl)) Or (.Key(Key_LControl)) Then If .Key(Key_Left) Then Look = Act_Look + L_WEST ElseIf .Key(Key_Right) Then Look = Act_Look + L_EAST ElseIf .Key(Key_Down) Then Look = Act_Look + L_SOUTH ElseIf .Key(Key_Up) Then Look = Act_Look + L_NORTH End If Else If .Key(Key_Left) Then Look = Act_Look + L_WEST actMov = D_WEST Call GetTile(D_WEST) ElseIf .Key(Key_Right) Then Look = Act_Look + L_EAST actMov = D_EAST Call GetTile(D_EAST) ElseIf .Key(Key_Down) Then actMov = D_SOUTH Look = Act_Look + L_SOUTH Call GetTile(D_SOUTH) ElseIf .Key(Key_Up) Then Look = Act_Look + L_NORTH actMov = D_NORTH Call GetTile(D_NORTH) End If End IfElse lastMov = actMov Call GetTile(D_LAST)End IfEnd With End Sub
El timer llama al procedimiento GetTile() q solo hace unas comprobaciones y llama a Walk()
Estas son las variables
--- Código: Text --- Public actMov As IntegerPublic lastMov As IntegerPublic Speed As DoublePublic Movement As DoublePublic posX As DoublePublic posY As Double
--- Código: Text --- Public Sub Walk(Direction As Integer) Select Case Direction Case D_NORTH posY = posY - Speed Movement = Movement + Speed Case D_SOUTH posY = posY + Speed Movement = Movement + Speed Case D_EAST posX = posX + Speed Movement = Movement + Speed Case D_WEST posX = posX - Speed Movement = Movement + Speed Case D_LAST Select Case lastMov Case D_NORTH If 1 = Int(Movement) Then Movement = 0 actMov = D_NONE lastMov = D_NONE Look = Act_Look + L_NORTH ElseIf Movement = 0.3 Then Look = Act_Look + L_NORTH + 1 posY = posY - Speed Movement = Movement + Speed ElseIf Movement = 0.3 Then Look = Act_Look + L_NORTH + 2 posY = posY - Speed Movement = Movement + Speed Else posY = posY - Speed Movement = Movement + Speed End If Case D_SOUTH If 1 = Int(Movement) Then Movement = 0 actMov = D_NONE lastMov = D_NONE Look = Act_Look + L_SOUTH ElseIf Movement = 0.3 Then Look = Act_Look + L_SOUTH + 1 posY = posY + Speed Movement = Movement + Speed ElseIf Movement = 0.6 Then Look = Act_Look + L_SOUTH + 2 posY = posY + Speed Movement = Movement + Speed Else posY = posY + Speed Movement = Movement + Speed End If Case D_EAST If 1 = Int(Movement) Then Movement = 0 actMov = D_NONE lastMov = D_NONE Look = Act_Look + L_EAST ElseIf Movement = 0.3 Then Look = Act_Look + L_EAST + 1 posX = posX + Speed Movement = Movement + Speed ElseIf Movement = 0.6 Then Look = Act_Look + L_EAST + 2 posX = posX + Speed Movement = Movement + Speed Else posX = posX + Speed Movement = Movement + Speed End If Case D_WEST If 1 = Int(Movement) Then Movement = 0 actMov = D_NONE lastMov = D_NONE Look = Act_Look + L_WEST ElseIf Movement = 0.3 Then Look = Act_Look + L_WEST + 1 posX = posX - Speed Movement = Movement + Speed ElseIf Movement = 0.6 Then Look = Act_Look + L_WEST + 2 posX = posX - Speed Movement = Movement + Speed Else posX = posX - Speed Movement = Movement + Speed End If End Select End Select Debug.Print MovementEnd Sub
Los 0.3 y 0.6 en realidad son variables q dependen de speed, pero no hace ninguna diferencia.
Bueno, espero no se haga muy engorroso. Aver si alguien tiene idea q error estoy cometiendo.
En cuanto al valor de Movement lo imprimo directamente en la ventana inmediato, como tipo double y aparece "1" asique no creo q sea ese el problema
Bueno, eso es todo, gracias desde ya.
Saludos
cpmario:
Revisa esta rutina casi igual a la que coloque anteriormente y verás que no funciona con variables Double.
--- Código: Text ---Option Explicit Dim Movement As DoubleConst Speed As Double = 0.1 Private Sub Timer1_Timer() If 1 = Int(Movement) Then Movement = 0 Else Movement = Movement + Speed End If Debug.Print Movement If Movement = 0.3 Or Movement = 0.8 Or Movement = 0.9 Then Stop End IfEnd Sub
Verás que el error que mencionas puede reproducirse con esta rutina, además notarás que tampoco se detiene con los decimales 0.3, 0.8 y 0.9.
Es un error en VB. No sé cual es el motivo, hay que tratar de averiguar que alternativa puede existir.
:comp:
Epa:
Muchas gracias.
Me ha sido de gran utilidad ese aporte.
Ya que es un problema numerico, pase el numero a un string de 1 byte y lo comparo como cadenas y fuinciona.
Gracias nuevamente.
Saludos
Navegación
Ir a la versión completa