• Viernes 3 de Mayo de 2024, 11:41

Autor Tema:  Error 9  (Leído 2045 veces)

ebolo

  • Miembro MUY activo
  • ***
  • Mensajes: 188
    • Ver Perfil
Error 9
« en: Viernes 30 de Enero de 2004, 11:48 »
0
Hola.
Aquí os pongo un código que me está dando error nº 9 de subindice (el subindice está fuera del intervalo)  y no sé porque es.
Esto mismo, con otros nombres de variables, lo tengo puesto en otro programa y no me dá error.
-----------------------------------------
Private Sub Command6_Click()
Dim mensaje As String
Dim respuesta() As Byte, q As Integer
Dim respq(1 To 8) As Long
Dim mensrec As String, tempo As Double
If MSComm1.PortOpen = False Then
    MsgBox "Abrir puerto primero"
    Exit Sub
End If
If Text1.Text <> "" Then
   mensaje = ""
   For q = 1 To Len(Text1.Text) Step 2
   mensaje = mensaje & Chr$(Mid$(Text1.Text, q, 2))
   Next q
   MSComm1.Output = mensaje
End If
tempo = Timer
Do
      resp = MSComm1.Input
  'On Error GoTo errorp
   If MSComm1.InBufferCount >= 8 Then
     MsgBox MSComm1.InBufferCount
     'Call tramitarespuesta(respuesta)
   For q% = 1 To 8
        resp(q%) = respuesta(q% - 1)        '----AQUÍ ME DA EL ERROR
        If (q% = 3) Or (q% = 4) Or (q% = 5) Then
          resp(q%) = Val(Hex$(respuesta(q%)))
        End If
        MsgBox "respq(" & q% & "):" & resp(q%)
        mensrec = mensrec & resp(q%)
     Next q%
   Text3.Text = Text3.Text & mensrec
   End If
        If (tempo) > (Timer + 5) Then
            tempo = Timer
        End If
   Text3.Text = Timer
Loop Until (Timer - 5) > tempo
 Exit Sub

errorp:
 If Err.Number <> 0 Then
   MsgBox "Error"
 Resume Next
   End If
End Sub
-----------------------------------------------
Si sabeis que puede ser me podriais echar una mano.
Saludos.

carlosjrey

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Re: Error 9
« Respuesta #1 en: Viernes 30 de Enero de 2004, 13:10 »
0
Hola!

Error no es de las variables, es del contador, si tienes un contador de 1-8 tienes 8 posisciones, si  la longitud de la cadena supera este intervalo entonces el contador tratara de llegar a dicha longitud, entonces alli supera el numero de elementos que tienes reservados para la matriz y se produce ese error, en definitiva tu bucle esta superando el numero de valores que puede tomar..  
Saludos  :hola:

ebolo

  • Miembro MUY activo
  • ***
  • Mensajes: 188
    • Ver Perfil
Re: Error 9
« Respuesta #2 en: Viernes 30 de Enero de 2004, 13:39 »
0
Gracias carlosjrey por la rápida respuesta.
He modificado el código pero me sigue dando el mismo error.

---------------------------------------------
Private Sub Command6_Click()
Dim mensaje As String
Dim respuesta() As Byte
Dim q, t As Integer
ReDim respq(1 To 8) As Long
Dim mensrec As String, tempo As Double

If MSComm1.PortOpen = False Then
    MsgBox "Abrir puerto primero"
    Exit Sub
End If

If Text1.Text <> "" Then
   mensaje = ""
   For t = 1 To Len(Text1.Text) Step 2
   mensaje = mensaje & Chr$(Mid$(Text1.Text, t, 2))
   Next t
   MSComm1.Output = mensaje
End If

tempo = Timer

Do
      respuesta = MSComm1.Input
  'On Error GoTo errorp
   If MSComm1.InBufferCount >= 8 Then
     MsgBox MSComm1.InBufferCount
     'Call tramitarespuesta(respuesta)
     
   For q = 1 To 8
        respq(q) = respuesta(q - 1)
        If (q = 3) Or (q = 4) Or (q = 5) Then
          respq(q) = Val(Hex$(respuesta(q)))
        End If
        MsgBox "respq(" & q & "):" & respq(q)
        mensrec = mensrec & respq(q)
     Next q
   Text3.Text = Text3.Text & mensrec
   End If
        If (tempo) > (Timer + 5) Then
           tempo = Timer
        End If
   Text3.Text = Timer
Loop Until (Timer - 5) > tempo
 Exit Sub

errorp:
 If Err.Number <> 0 Then
   MsgBox "Error"
 Resume Next
   End If
End Sub
-------------------------------------------------

Saludos.

carlosjrey

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Re: Error 9
« Respuesta #3 en: Viernes 30 de Enero de 2004, 13:49 »
0
Cita de: "ebolo"
Gracias carlosjrey por la rápida respuesta.
He modificado el código pero me sigue dando el mismo error.

---------------------------------------------
Private Sub Command6_Click()
Dim mensaje As String
Dim respuesta() As Byte
Dim q, t As Integer
ReDim respq(1 To 8) As Long
Dim mensrec As String, tempo As Double

If MSComm1.PortOpen = False Then
    MsgBox "Abrir puerto primero"
    Exit Sub
End If

If Text1.Text <> "" Then
   mensaje = ""
   For t = 1 To Len(Text1.Text) Step 2
   mensaje = mensaje & Chr$(Mid$(Text1.Text, t, 2))
   Next t
   MSComm1.Output = mensaje
End If

tempo = Timer

Do
      respuesta = MSComm1.Input
  'On Error GoTo errorp
   If MSComm1.InBufferCount >= 8 Then
     MsgBox MSComm1.InBufferCount
     'Call tramitarespuesta(respuesta)
     
   For q = 1 To 8
        respq(q) = respuesta(q - 1)
        If (q = 3) Or (q = 4) Or (q = 5) Then
          respq(q) = Val(Hex$(respuesta(q)))
        End If
        MsgBox "respq(" & q & "):" & respq(q)
        mensrec = mensrec & respq(q)
     Next q
   Text3.Text = Text3.Text & mensrec
   End If
        If (tempo) > (Timer + 5) Then
           tempo = Timer
        End If
   Text3.Text = Timer
Loop Until (Timer - 5) > tempo
 Exit Sub

errorp:
 If Err.Number <> 0 Then
   MsgBox "Error"
 Resume Next
   End If
End Sub
-------------------------------------------------

Saludos.
For q% = 1 To 8
resp(q%) = respuesta(q% - 1) '----AQUÍ ME DA EL ERROR
If (q% = 3) Or (q% = 4) Or (q% = 5) Then
resp(q%) = Val(Hex$(respuesta(q%)))
End If

' se supone que cuando inicias el bucle, tu contador va de 1 hasta 8, si restas 1 a q%, el primer valor que toma es 0, es decir: 1-1 =0, y el intervalo es ascendente de 1 a 8, le estas restamdo valores a q% y mas bien creo que debieras de agragarle y ni si quiera creo que eso sea necesario por que el bucle for..next por defecto te suma 1, si colocas step 2 te suma 2 y asi sucesivamente..

 :whistling:

ebolo

  • Miembro MUY activo
  • ***
  • Mensajes: 188
    • Ver Perfil
Re: Error 9
« Respuesta #4 en: Viernes 30 de Enero de 2004, 17:11 »
0
Nada que no hay manera, no sé donde fallo, yo te entiendo carlosjrey lo que me comentas; le resto a la variable respuesta(q-1) porque es de tipo byte, y el primer valor que llega con el MSComm1.input es el (0).
Lo he metido en un módulo por separar la respuesta y tratarla, pero me sigue dando el mismo error.
He vuelto a modificar un poco el código:
------------------------------------
Private Sub Command6_Click()
Dim mensaje
Dim tempo As Double
Dim respuesta() As Byte
If MSComm1.PortOpen = False Then
    MsgBox "Abrir puerto primero"
    Exit Sub
End If

If Text1.Text <> "" Then
   mensaje = ""
   checksum% = (Val(Text1.Text) + Val(Text4.Text) + 0 + 0 + 0 + 63) Mod (256)
   'MsgBox checksum%
   mensaje = Chr$(Val(Text1.Text)) & Chr$(Val(Text4.Text)) & Chr$(0) & Chr$(0) & Chr$(0) & Chr$(63) & Chr$(checksum) & Chr$(13)
   MSComm1.Output = mensaje
End If

tempo = Timer

Do
      respuesta = MSComm1.Input
     
  'On Error GoTo errorp
   If MSComm1.InBufferCount >= 8 Then
     MsgBox MSComm1.InBufferCount
     Call Tramitarespuesta(respuesta())
   End If
Loop Until (Timer - 5) > tempo
End Sub

Sub Tramitarespuesta(respuesta)
Dim X As Integer
ReDim respq(1 To 8) As Long
Dim mensrec As String, tempo As Double
For X% = 1 To 8
       MsgBox Form1.MSComm1.Input
        respq(X%) = respuesta(X% - 1)
        If (X% = 3) Or (X% = 4) Or (X% = 5) Then
          respq(X%) = Val(Hex$(respuesta(X%)))
        End If
        MsgBox "respq(" & X% & "):" & respq(X%)
        mensrec = mensrec & respq(X%)
Next X%
   Text3.Text = Text3.Text & mensrec
        If (tempo) > (Timer + 5) Then
           tempo = Timer
        End If
   Text3.Text = Timer
 Exit Sub
errorp:
 If Err.Number <> 0 Then
   MsgBox "Error"
 Resume Next
 End If
End Sub
------------------------------------------------

Saludos y gracias por la ayuda.

ebolo

  • Miembro MUY activo
  • ***
  • Mensajes: 188
    • Ver Perfil
Re: Error 9
« Respuesta #5 en: Viernes 30 de Enero de 2004, 18:24 »
0
Después de comprobar con Ubound, he visto que no me coge bien el input, me da valor 1 cuando debiera ser 7, pero no sé porque es porque en un programa me lo hace bien y en el otro, que sólo cambia en principio el diseño, no.
Saludos.

ebolo

  • Miembro MUY activo
  • ***
  • Mensajes: 188
    • Ver Perfil
Re: Error 9
« Respuesta #6 en: Viernes 30 de Enero de 2004, 18:56 »
0
Solucionado. llevo todo el día con ello y la cabeza echa un bombo.
Tenía puesta la línea de "respuesta=MSComm1.Imput" fuera de la condición:
 If MSComm1.InBufferCount >= 8 Then

y tenía que estar dentro de la condición.
Eso me producía el error de la matriz, porque sólo me vale el input que tiene 8 byte, y estaba igualando "respuesta=" a cualquier valor del input.

Saludos. :hola:  :brickwall:  :brickwall: