none
Error "index was outside the bounds of the array", ayuda RRS feed

  • Pregunta

  • Hola que tal, antes que nada un gusto saludarlos!

    Tengo un iconveniente con un ejercicio en el cual implementamos cortes de control, el mismo pide que dado unos datos (estos son carrera,materia,profesor) que se encuentran en un archivo de texto se desea saber por cada carrera y materia la cantidad de profesores asignados. El archivo debe estar ordenado segun carrera y materia.

    El mismo archivo lo hago en un bloc de notas, les dejo un ejemplo de lo que tiene el archivo

    Ingenieria en sistemas;programacion 1;rafale perez
    Ingenieria en sistemas;programacion 1;julio garcia
    Ingenieria en sistemas;sistemas de computacion 2;maria sanchez
    Ingenieria en sistemas;sistemas de computacion 2;martin perez
    Ingenieria en sistemas;sistemas de computacion 2;flavio gomez
    Ingenieria en sistemas;historia de la ciencia y de la tecnica;ramon diaz
    Licenciatura en matematica;analisis matematico 1;carlos nain
    Licenciatura en matematica;algebra 2;ramon vargas
    Licenciatura en matematica;informatica 2;luis perati

    El codigo en vb.net 2005 es el siguiente

    Imports System.IO

    Public Class Form1

        Private Sub btncargar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btncargar.Click

            Dim reader As New StreamReader("c:\users\owner\desktop\tp9.txt")
            Dim v As String()
            Dim carrera As String = String.Empty
            Dim materia As String = String.Empty
            Dim cantidad_profesores As Integer = 0
            Dim salir As Boolean = False
            v = reader.ReadLine().Split(";"c)
            While Not salir
                carrera = v(0)
                ListBox1.Items.Add(String.Format("Carrera{0}", carrera))
                While Not salir AndAlso carrera = v(0)
                    materia = v(1)------------------------------------------------------------------->error!!!!
                    ListBox1.Items.Add(String.Format("Materia {0}", materia))
                    cantidad_profesores = 0
                    While Not salir AndAlso carrera = v(0) AndAlso materia = v(1)
                        cantidad_profesores = cantidad_profesores + 1
                        If reader.EndOfStream Then
                            salir = True
                        Else
                            v = reader.ReadLine().Split(";"c)
                        End If
                    End While
                    ListBox1.Items.Add(String.Format("Cantidad de profesores {0}", cantidad_profesores))
                End While
            End While
            reader.Close()
        End Sub
    End Class

    Porque me sale este error al probar el codigo "index was outside the bounds of the array"??

    Saludos y desde ya les agradezco por las respuestas

    miércoles, 5 de noviembre de 2014 19:13

Respuestas

  • Acabo de probar tu programa, y funciona bien. Pulsando el botón Button1 me muestra correctamente los resultados en el ListBox1.

    Resultados de la ejecución del programa

    El único caso en el que he conseguido que falle es el de que se inserte una línea en blanco al principio del archivo de texto. Cuando esto sucede, está claro por qué falla: El ReadLine() devuelve una cadena vacía y el primer Split solo obtiene un array con un único elemento v(0) a partir de dicha cadena. En consecuencia, da un error al acceder a v(1). La solución es obvia: o bien arregla el fichero de texto para que no tenga líneas vacías, o bien modifica el fuente para que si encuentra una linea vacía al hacer el ReadLine se la salte y no intente procesarla.

    jueves, 6 de noviembre de 2014 5:37

Todas las respuestas

  • La verdad es que tu procedimiento está un poco liado y no es fácil seguir la ejecución a simple vista, con los varios bucles anidados y condiciones booleanas para salir de ellos y lecturas del streamreader en distintos puntos. Te recomendaría fragmentarlo en varios procedimientos más simples para reducir la complejidad ciclomática.

    Cuando en el código no se ve la causa de un error a simple vista, lo que se hace es usar el Depurador en Visual Studio. Pon un punto de ruptura en el primer While, y luego ve ejecutando el programa paso a paso con el debugger, examinando las variables a cada paso para ver dónde dejan de tener los valores esperados, hasta que encuentres por qué el array v tiene menos de dos elementos en el sitio en que te sale el error.

    miércoles, 5 de noviembre de 2014 19:59
  • Dim V As String() = reader.ReadLine().Split(New Char() {";"c})


    G. Poliovei

    miércoles, 5 de noviembre de 2014 20:10
  • Hola Alberto, gracias por tu respuesta, si se que es un poco embrollado, es que estamos cursando vb.net y nos dieron este ejercicio como ejemplo, y lo estoy tratando de entender pero no le encuentro la vuelta del porque el error.
    miércoles, 5 de noviembre de 2014 22:43
  • Acabo de probar tu programa, y funciona bien. Pulsando el botón Button1 me muestra correctamente los resultados en el ListBox1.

    Resultados de la ejecución del programa

    El único caso en el que he conseguido que falle es el de que se inserte una línea en blanco al principio del archivo de texto. Cuando esto sucede, está claro por qué falla: El ReadLine() devuelve una cadena vacía y el primer Split solo obtiene un array con un único elemento v(0) a partir de dicha cadena. En consecuencia, da un error al acceder a v(1). La solución es obvia: o bien arregla el fichero de texto para que no tenga líneas vacías, o bien modifica el fuente para que si encuentra una linea vacía al hacer el ReadLine se la salte y no intente procesarla.

    jueves, 6 de noviembre de 2014 5:37