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

[0] Índice de Mensajes

Ir a la versión completa