none
Error al Procesar un array dentro de una funcion RRS feed

  • Pregunta

  • Estimados Colegas.

    Un saludo y esperando que Dios les bendiga mucho, les quería pedir ayuda como siempre con un error al que me enfrento.

    Me explico, espero ser lo mas claro posible aunque pondré código de ejemplo para ilustrar lo que me sucede.

    Dentro de una función proceso un array unidimensional de X elementos o ítems. NO UNA LISTA PORQUE NO ME SIRVE YA LO PROBE... que paso como argumento en la llamada a dicha función, pues bien cuando recorro este array en busca de un dato especifico el cual puede repetirse en otra parte del array cuando encuentro el segmento donde esta este dato guando el encabezado y el pie del segmento y salgo de recorrer el array. en otro siclo recorro solo el segmento donde se encontró el dato y modifico dicho dato y retorno el array completo con el dato modificado.

    Espero que esta grafica explique mas claramente lo que expuse. Las X es el ítem que debo buscar y la Z el diferenciador.

    +CABECERA MAESTRA
    +---ELEMENTO 1
    +---ELEMENTO 2
    +---ELEMENTO 3
    +---ELEMENTO VACIO
    +---CABECERA SECUNDARIA 1
    +------ELEMENTO 1
    +------ELEMENTO 2
    +------ELEMENTO X
    +------ELEMENTO 4
    +---PIE CABECERA SECUNDARIA 1
    +---ELEMENTO VACIO
    +---CABECERA SECUNDARIA 2
    +------ELEMENTO 1
    +------ELEMENTO 2
    +------ELEMENTO XZ (BUSCADO)
    +---PIE CABECERA SECUNDARIA 2
    +---ELEMENTO VACIO
    +---CABECERA SECUNDARIA 3
    +------ELEMENTO 1
    +------ELEMENTO X
    +------ELEMENTO 3
    +------ELEMENTO 4
    +------ELEMENTO 5
    +------ELEMENTO 6
    +---PIE CABECERA SECUNDARIA 3
    +---ELEMENTO VACIO
    +PIE CABECERA MAESTRA

    Los elementos con datos son los que tienen numero por que puede haber elementos vacíos.

    Por razones fuera de mi control no puedo colocar el código real pero si ejemplificare la idea.

    'Llamada a la funcion
    arrayRespuesta = function ProcesarArray(arrayProcesar, "Cabecera 2", "Item", "x", ValorNuevo) 
    
    
    'Funcion ProcesarArray
    Private Function ProcesarArray(ByVal arrayTrabajo As String(), Byval NombreCabecera As String, ByVal NombreItem As String, ByVal IdDato As String ByVal DatoCambio as String) As String()
    Dim i As Integer
    Dim PosicionCabecera As Integer
    Dim PosicionPieCabecera As Integer
    Dim PieCabecera as string = CaracterPie & NombreCabecera
    Dim estoydentro as Boolean
    Dim arrayTemporal as string()
    
       Try
    
       'Recorro el array 
       For i=0 to arrayTrabajo..GetUpperBound(0) - 1
          'Si en esta iteración es la cabecera guardamos la
          'Posición y saltamos a la siguiente iteracion
          If arrayTrabajo(i),trim() = NombreCabecera Then
             PosiciónCabecera = i
             estoydentro = True
             Continue For
          else
              'preguntamos si estoy dentro de la cabecera
              'si no es asi saltamos a la siguiente iteracion
              If Not estoydentro Then
                 Continue For
              End If
    
               'Si el ítem esta vacio saltamos a la
               'siguiente iteracion
               If arrayTrabajo(i).Trim.Length() < 1 Then
                  Continue For
               End if
    
               'Si e el pie de la cabecera guardamos la posición
               'y salimos del ciclo for
               If arrayTrabajo(i).Trim() = PieCabecera  Then
                  PosicionPieCabecera = i
                  Exit For
               End If
    
    
          End If
       Next
    
        'Ahora modificamos el Ítem dentro del segmento
        For i = PosicionCabecera  to PosicionPieCabecera
           If arrayTrabajo(i).Trim.IndexOf(IdDato) <> -1 Then
              if arrayTrabajo(i).Trim.Substring(0, arrayTrabajo(i).Trim.IndexOf(IdDato)) = NombreItem Then
                  arrayTrabajo(i) = NombreItem.Trim(9 & IdDato.Trim() & DatoCambio.Trim()
               End If
           End If
        Next
    
        Return arrayTrabajo
    
         Catch ex As Exception
             ReDim arrayTemporal(0)
             arrayTemporal(0) = ex.Message.ToString()
             Return arrayTemporal
         End Try
    
    End Function

    Al colocar la línea que esta en negritas me arroja un error "Object reference not set to an instance of an Object.System.String[]" no se por que, todo esta referenciado y esa línea la tengo en otro código y si funciona.

    Espero haberme dado a entender.

    Reviso y reviso y leo y no logro entender por que, según mi lógica debiera funcionar, si se dan cuenta no es código complejo.

    Gracias de ante mano primero por haver leído el post y por contestarlo.


    • Editado Negochile sábado, 1 de abril de 2017 22:16 Correccion texto
    sábado, 1 de abril de 2017 22:13

Respuestas

  • Lamentablemente esta función se encuentra en una dll y hasta donde yo se no se puede correr el debugger en ellas o si.

    ¿Por qué no vas a poder correr el debugger sobre una DLL? Lo que no puedes hacer es iniciar la depuración sobre la DLL. Pero si inicias la depuración sobre el ejecutable que llama a la DLL, el depurador salta desde el ejecutable a la DLL cuando se hace la llamada, y puedes seguir depurando dentro de la DLL.

    Y si sólo tienes el fuente de la DLL y no tienes el del ejecutable, hay otra cosa que se puede hacer: inicias el programa y cuando esté rodando, desde Visual Studio usas la opción Debug -> Attach y lo enganchas al proceso que acabas de lanzar y que sabes que va a llamar a la DLL. Pones un punto de ruptura en la DLL, y cuando el ejecutable salta a ella, Visual Studio detiene la ejecución en el breakpoint dentro de la DLL.

    • Marcado como respuesta Negochile lunes, 3 de abril de 2017 2:54
    domingo, 2 de abril de 2017 18:30

Todas las respuestas

  • El error no es evidente a simple vista. Pero para eso tienes el debugger. Cuando se te para sobre la línea afectada mostrando el error, ¿Qué valores tienen las variables? Examinándolas con el debugger, ¿cuál de ellas es la que vale Nothing?
    domingo, 2 de abril de 2017 6:28
  • Estimado Alberto.

    Bendiciones, Si como dices podría usar el debugger para identificar concretamente la razón de esto. Lamentablemente esta función se encuentra en una dll y hasta donde yo se no se puede correr el debugger en ellas o si.

    Como decía en mi explicación probé la funcionalidad en forma externa reproduciendo la funcionalidad de este código y no presento inconvenientes y me entrego el resultado que necesitaba.

    además te cuento que fui ejecutando parte por parte a fin de revisar que todo el código estuviera bien y no me dio el error pero cuando lo ejecuto completo falla.

    domingo, 2 de abril de 2017 15:44
  • Lamentablemente esta función se encuentra en una dll y hasta donde yo se no se puede correr el debugger en ellas o si.

    ¿Por qué no vas a poder correr el debugger sobre una DLL? Lo que no puedes hacer es iniciar la depuración sobre la DLL. Pero si inicias la depuración sobre el ejecutable que llama a la DLL, el depurador salta desde el ejecutable a la DLL cuando se hace la llamada, y puedes seguir depurando dentro de la DLL.

    Y si sólo tienes el fuente de la DLL y no tienes el del ejecutable, hay otra cosa que se puede hacer: inicias el programa y cuando esté rodando, desde Visual Studio usas la opción Debug -> Attach y lo enganchas al proceso que acabas de lanzar y que sabes que va a llamar a la DLL. Pones un punto de ruptura en la DLL, y cuando el ejecutable salta a ella, Visual Studio detiene la ejecución en el breakpoint dentro de la DLL.

    • Marcado como respuesta Negochile lunes, 3 de abril de 2017 2:54
    domingo, 2 de abril de 2017 18:30
  • Alberto bendiciones.

    Eso no lo sabia y no se me había ocurrido, que bueno que me ayudaste revisare eso, y te cuento como me fue.

    Estamos al habla.

    lunes, 3 de abril de 2017 0:16
  • Alberto Bendiciones.

    Bueno, Agradecerte por tu orientación sobre algo que no sabia y pensaba que no se podía.

    Realice lo que mencionas y al realizar el recorrido encontré que cometí el error de no borrar un array temporal al final de de la línea que esta después de lo que marque en negrillas ósea en la asignación de nuevo valor. No me fije que estaba eso allí, y lo pasaba de largo cuando leía el código

    error de apurón jajaja gracias. me estaba matando jajaja

    Gracias y muchas bendiciones

    lunes, 3 de abril de 2017 3:03