• Domingo 22 de Diciembre de 2024, 14:50

Autor Tema:  1 != 1 ??  (Leído 1620 veces)

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
1 != 1 ??
« en: Jueves 4 de Enero de 2007, 04:16 »
0
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
  1.  
  2.           If 1 = Int(Movement) Then
  3.             Movement = 0
  4.             actMov = D_NONE
  5.             lastMov = D_NONE
  6.             Look = Act_Look + L_SOUTH
  7.           Else
  8.             posY = posY + Speed
  9.             Movement = Movement + Speed
  10.           End If
  11.  
  12.  

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
  1.  
  2.  0
  3.  0,1
  4.  0,2
  5.  0,3
  6.  0,4
  7.  0,5
  8.  0,6
  9.  0,7
  10.  0,8
  11.  0,9
  12.  1
  13.  1,1
  14.  0
  15.  
  16.  

Agradeceria enormemente cualquier ayuda.

Desde ya muchas gracias, saludos
The sweet smell of a great sorrow lies over the land.


cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: 1 != 1 ??
« Respuesta #1 en: Jueves 4 de Enero de 2007, 07:59 »
0
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
  1. Option Explicit
  2.  
  3. Dim Movement As Single
  4. Const Speed As Single = 0.1
  5.  
  6. Private Sub Timer1_Timer()
  7.     If 1 = Int(Movement) Then
  8.         Movement = 0
  9.     Else
  10.         Movement = Movement + Speed
  11.     End If
  12. End Sub
  13.  

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: 1 != 1 ??
« Respuesta #2 en: Jueves 4 de Enero de 2007, 19:55 »
0
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
  1.  
  2. Private Sub tmrMove_Timer()
  3.  
  4. nx = posX[CODE]
  5. ny = posY
  6.  
  7. With m_Input
  8. If actMov = D_NONE Then
  9.    
  10.       If (.Key(Key_RControl)) Or (.Key(Key_LControl)) Then
  11.         If .Key(Key_Left) Then
  12.           Look = Act_Look + L_WEST
  13.         ElseIf .Key(Key_Right) Then
  14.           Look = Act_Look + L_EAST
  15.         ElseIf .Key(Key_Down) Then
  16.           Look = Act_Look + L_SOUTH
  17.         ElseIf .Key(Key_Up) Then
  18.           Look = Act_Look + L_NORTH
  19.         End If
  20.       Else
  21.         If .Key(Key_Left) Then
  22.           Look = Act_Look + L_WEST
  23.           actMov = D_WEST
  24.           Call GetTile(D_WEST)
  25.         ElseIf .Key(Key_Right) Then
  26.           Look = Act_Look + L_EAST
  27.           actMov = D_EAST
  28.           Call GetTile(D_EAST)
  29.         ElseIf .Key(Key_Down) Then
  30.           actMov = D_SOUTH
  31.           Look = Act_Look + L_SOUTH
  32.           Call GetTile(D_SOUTH)
  33.         ElseIf .Key(Key_Up) Then
  34.           Look = Act_Look + L_NORTH
  35.           actMov = D_NORTH
  36.           Call GetTile(D_NORTH)
  37.         End If
  38.       End If
  39. Else
  40.     lastMov = actMov
  41.     Call GetTile(D_LAST)
  42. End If
  43. End With
  44.  
  45. End Sub
  46.  
  47.  

El timer llama al procedimiento GetTile() q solo hace unas comprobaciones y llama a Walk()

Estas son las variables
Código: Text
  1.  
  2. Public actMov As Integer
  3. Public lastMov As Integer
  4. Public Speed As Double
  5. Public Movement As Double
  6. Public posX As Double
  7. Public posY As Double
  8.  
  9.  


Código: Text
  1.  
  2. Public Sub Walk(Direction As Integer)
  3.   Select Case Direction
  4.  
  5.     Case D_NORTH
  6.       posY = posY - Speed
  7.       Movement = Movement + Speed
  8.      
  9.     Case D_SOUTH
  10.       posY = posY + Speed
  11.       Movement = Movement + Speed
  12.      
  13.     Case D_EAST
  14.       posX = posX + Speed
  15.       Movement = Movement + Speed
  16.      
  17.     Case D_WEST
  18.       posX = posX - Speed
  19.       Movement = Movement + Speed
  20.      
  21.     Case D_LAST
  22.       Select Case lastMov
  23.         Case D_NORTH
  24.           If 1 = Int(Movement) Then
  25.             Movement = 0
  26.             actMov = D_NONE
  27.             lastMov = D_NONE
  28.             Look = Act_Look + L_NORTH
  29.           ElseIf Movement = 0.3 Then
  30.             Look = Act_Look + L_NORTH + 1
  31.             posY = posY - Speed
  32.             Movement = Movement + Speed
  33.           ElseIf Movement = 0.3 Then
  34.             Look = Act_Look + L_NORTH + 2
  35.             posY = posY - Speed
  36.             Movement = Movement + Speed
  37.           Else
  38.             posY = posY - Speed
  39.             Movement = Movement + Speed
  40.           End If
  41.          
  42.         Case D_SOUTH
  43.           If 1 = Int(Movement) Then
  44.             Movement = 0
  45.             actMov = D_NONE
  46.             lastMov = D_NONE
  47.             Look = Act_Look + L_SOUTH
  48.           ElseIf Movement = 0.3 Then
  49.             Look = Act_Look + L_SOUTH + 1
  50.             posY = posY + Speed
  51.             Movement = Movement + Speed
  52.           ElseIf Movement = 0.6 Then
  53.             Look = Act_Look + L_SOUTH + 2
  54.             posY = posY + Speed
  55.             Movement = Movement + Speed
  56.           Else
  57.             posY = posY + Speed
  58.             Movement = Movement + Speed
  59.           End If
  60.          
  61.         Case D_EAST
  62.             If 1 = Int(Movement) Then
  63.               Movement = 0
  64.               actMov = D_NONE
  65.               lastMov = D_NONE
  66.               Look = Act_Look + L_EAST
  67.             ElseIf Movement = 0.3 Then
  68.               Look = Act_Look + L_EAST + 1
  69.               posX = posX + Speed
  70.               Movement = Movement + Speed
  71.             ElseIf Movement = 0.6 Then
  72.               Look = Act_Look + L_EAST + 2
  73.               posX = posX + Speed
  74.               Movement = Movement + Speed
  75.             Else
  76.               posX = posX + Speed
  77.               Movement = Movement + Speed
  78.             End If
  79.            
  80.         Case D_WEST
  81.           If 1 = Int(Movement) Then
  82.             Movement = 0
  83.             actMov = D_NONE
  84.             lastMov = D_NONE
  85.             Look = Act_Look + L_WEST
  86.           ElseIf Movement = 0.3 Then
  87.             Look = Act_Look + L_WEST + 1
  88.             posX = posX - Speed
  89.             Movement = Movement + Speed
  90.           ElseIf Movement = 0.6 Then
  91.             Look = Act_Look + L_WEST + 2
  92.             posX = posX - Speed
  93.             Movement = Movement + Speed
  94.           Else
  95.             posX = posX - Speed
  96.             Movement = Movement + Speed
  97.           End If
  98.       End Select
  99.   End Select
  100.   Debug.Print Movement
  101. End Sub
  102.  
  103.  

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
The sweet smell of a great sorrow lies over the land.


cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: 1 != 1 ??
« Respuesta #3 en: Jueves 4 de Enero de 2007, 21:42 »
0
Revisa esta rutina casi igual a la que coloque anteriormente y verás que no funciona con variables Double.

Código: Text
  1. Option Explicit
  2.  
  3. Dim Movement As Double
  4. Const Speed As Double = 0.1
  5.  
  6. Private Sub Timer1_Timer()
  7.     If 1 = Int(Movement) Then
  8.        Movement = 0
  9.     Else
  10.         Movement = Movement + Speed
  11.     End If
  12.    
  13.     Debug.Print Movement
  14.    
  15.     If Movement = 0.3 Or Movement = 0.8 Or Movement = 0.9 Then
  16.         Stop
  17.     End If
  18. End Sub
  19.  

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

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: 1 != 1 ??
« Respuesta #4 en: Viernes 5 de Enero de 2007, 00:22 »
0
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
The sweet smell of a great sorrow lies over the land.