SOLUCIONADO Algo raro con un array

SOLUCIONADO Algo raro con un array

Postby Willi Quintana » Mon Jan 04, 2016 4:15 pm

Hola amigos... en una función, lleno un array unidimensional con datos de un producto, luego modifico algunos registros con nuevos valores, dentro de la función el array esta modificado, pero al retornar a la función que lo llamo, el array aparece como si no se hubiera modificado... Estoy cometiendo algún error??
Code: Select all  Expand view  RUN

Function CargaDatos()
aDesPro := RelProductos(oMySQL, aDesPro, "QAZ123")

? aDesPro[ 2]                                                 // muestra  "01"      // los datos no cambiaron luego del AADD()
? aDesPro[12]                                                // muestra "UNIDAD"
...
..
.
Function RelProductos(oMySQL, aDesPro, cCodi)
aDesPro := {}
oDatos := DatosProducto(oMySQL, cCodi)          // aquí recabamos los datos de una tabla en MySQL
nLen := oDatos:RecCount()
FOR nCont := 1 TO nLen    // 77 campos
   AADD(aDesPro, oDatos:FieldGet(nCont)           // llenamos el array con los datos en forma unidimencional
NEXT nCont

? aDesPro[ 2]                                                 // muestra  "01"
? aDesPro[12]                                                // muestra "UNIDAD"

// realizo un cambio
aDesPro[ 2] := "12"
aDesPro[12] := "DOCENA"

? aDesPro[ 2]                                                 // muestra  "12"
? aDesPro[12]                                                // muestra "DOCENA"

Return(aDesPro)                                               // retorno el array con datos
 
Last edited by Willi Quintana on Tue Jan 05, 2016 1:23 am, edited 1 time in total.
User avatar
Willi Quintana
 
Posts: 1023
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Re: Algo raro con un array

Postby cnavarro » Mon Jan 04, 2016 5:56 pm

Willy, es estática la variable?
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6552
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Algo raro con un array

Postby hmpaquito » Mon Jan 04, 2016 6:11 pm

Willy, pues yo el codigo lo veo bien: no veo error y debe devolver "12" y "DOCENA". Seria bueno tener ese codigo mas sencillo para poder ejecutarlo incluso.
Me inclino porque el error lo tengas por otro sitio.

Cristóbal, creo que daría igual que fuera estatica, en la funcion, al ser parametro es una local y luego es devuelta.
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Algo raro con un array

Postby hebert_j_vargas » Mon Jan 04, 2016 6:20 pm

Willi Quintana wrote:Hola amigos... en una función, lleno un array unidimensional con datos de un producto, luego modifico algunos registros con nuevos valores, dentro de la función el array esta modificado, pero al retornar a la función que lo llamo, el array aparece como si no se hubiera modificado... Estoy cometiendo algún error??
Code: Select all  Expand view  RUN

Function CargaDatos()
aDesPro := RelProductos(oMySQL, aDesPro, "QAZ123")

? aDesPro[ 2]                                                 // muestra  "01"      // los datos no cambiaron luego del AADD()
? aDesPro[12]                                                // muestra "UNIDAD"
...
..
.
Function RelProductos(oMySQL, aDesPro, cCodi)
aDesPro := {}
oDatos := DatosProducto(oMySQL, cCodi)          // aquí recabamos los datos de una tabla en MySQL
nLen := oDatos:RecCount()
FOR nCont := 1 TO nLen    // 77 campos
   AADD(aDesPro, oDatos:FieldGet(nCont)           // llenamos el array con los datos en forma unidimencional
NEXT nCont

? aDesPro[ 2]                                                 // muestra  "01"
? aDesPro[12]                                                // muestra "UNIDAD"

// realizo un cambio
aDesPro[ 2] := "12"
aDesPro[12] := "DOCENA"

? aDesPro[ 2]                                                 // muestra  "12"
? aDesPro[12]                                                // muestra "DOCENA"

Return(aDesPro)                                               // retorno el array con datos
 



Hola Willi, solo debes pasar el array aDesPro por referencia:
Code: Select all  Expand view  RUN
aDesPro := RelProductos(oMySQL, @aDesPro, "QAZ123")
Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20141106)
FiveWin Version: FWHX 15.01
BCC 5.8.2
User avatar
hebert_j_vargas
 
Posts: 99
Joined: Thu Aug 02, 2012 3:21 pm

Re: Algo raro con un array

Postby RenOmaS » Mon Jan 04, 2016 7:01 pm

Es mejor colocar asi la llamada.

Code: Select all  Expand view  RUN

RelProductos(oMySQL, aDesPro, "QAZ123")


o

Code: Select all  Expand view  RUN
aDesPro := RelProductos(oMySQL, "QAZ123")

//y en la funcion
Function RelProductos(oMySQL, cCodi)
   Local aDesPro := {}
...
   Return aDesPro
 
Saludos/regards
RenOmaS

skype: americo.balboa
User avatar
RenOmaS
 
Posts: 205
Joined: Fri Oct 07, 2005 5:07 pm

SOLUCIONADO Re: Algo raro con un array

Postby Willi Quintana » Tue Jan 05, 2016 1:23 am

Hola Amigos,,, De verdad lo siento mucho,,, el error era mio,,, ese pedazo de código es de una app que tiene muchos años de trabajo,,, había una llamada de validación (media escondida) en la que no se procesaban los cambios... el manejo de los arrays en todos vuestros ejemplos y correcciones es correcto,,, mil disculpas.. :oops: :oops: :oops:
User avatar
Willi Quintana
 
Posts: 1023
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Re: SOLUCIONADO Algo raro con un array

Postby xmanuel » Tue Jan 05, 2016 3:28 pm

Willi aunque ya lo tienes solucionado el problema está aquí:
Function RelProductos(oMySQL, aDesPro, cCodi)
aDesPro := {}

Los arrays son tratados por referencia pero tu rompes la referencia tal como tratas aDesPro

Si quieres más rapidez yo lo haría así:
Code: Select all  Expand view  RUN


    Function CargaDatos()
    aDesPro := RelProductos(oMySQL, "QAZ123")

    ? aDesPro[ 2]                                                 // muestra  "01"      // los datos no cambiaron luego del AADD()
    ? aDesPro[12]                                                // muestra "UNIDAD"
    ...
    ..
    .
    Function RelProductos(oMySQL, cCodi)
    local aDesPro
    oDatos := DatosProducto(oMySQL, cCodi)          // aquí recabamos los datos de una tabla en MySQL
    nLen := oDatos:RecCount()
    aDesPro := array( nLEn )
    FOR nCont := 1 TO nLen    // 77 campos
       aDesPro[nCont ] := oDatos:FieldGet(nCont)           // llenamos el array con los datos en forma unidimencional
    NEXT nCont

    ? aDesPro[ 2]                                                 // muestra  "01"
    ? aDesPro[12]                                                // muestra "UNIDAD"

    // realizo un cambio
    aDesPro[ 2] := "12"
    aDesPro[12] := "DOCENA"

    ? aDesPro[ 2]                                                 // muestra  "12"
    ? aDesPro[12]                                                // muestra "DOCENA"

    Return(aDesPro)                                               // retorno el array con datos
     
 


He modificado tu función RelProductos para que devuelva un array nuevo, además está optimizada ya que array( nElemen ) crea un array con la dimension adecuada y dentro del for se asignan los elementos.
Con AADD tu programa tiene que REALOCAR memoria en cada llamada y eso es menos optimo. Siempre que se sepa la dimensión del array es mejor hacerlo como yo te digo. Espero que te valga. :D

PD: Pronto voy a sacar HDO para SQLite y me gustaría que fueras betatester si puedes :roll:
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 763
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: SOLUCIONADO Algo raro con un array

Postby hmpaquito » Tue Jan 05, 2016 4:46 pm

Manuel,

El codigo es feo pero es correcto: hace lo que se espera que haga.
Se rompe la referencia pero da igual porque en la llamada recibe de nuevo el array.

Saludos
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: SOLUCIONADO Algo raro con un array

Postby xmanuel » Tue Jan 05, 2016 10:21 pm

:lol: si es feo y muy poco optimizado.

Si se quiere se puede ir desde Sevilla a Malaga pasando por Cordoba pero si hay una autovía directa es mejor cogerla no?

Con array con dimensiones pequeñas no se notará mucho pero como le meta mucha caña se está duplicando el array en memoria ya que la referencia al array inicial no se rompe hasta que la segunda función devuelve el nuevo array y lo vuelve a asignar, y puede que aún así el "garbage collector" de Harbour tarde en liberarlo.
Eso y la optimización de crear el array ya dimensionado es mucho más rápido y efectivo usando la funcion array( n ) y luego asignar cada elemento a usar el AADD.

Yo tenía un profe de programación ( Java y PHP ) que decía que el código tenia que ser entendido por nosotros y otros programadores que lo leyeran, además de que fuera eficiente y compacto.
Y otro maestro como A. Linares al que he seguido desde hace muchisimos años ( mas de los que me gusta reconocer ) que también me enseñó algo parecido...

:twisted: :roll:
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 763
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: SOLUCIONADO Algo raro con un array

Postby Willi Quintana » Wed Jan 06, 2016 12:55 am

Gracias a todos,,, aquí siempre se aprende...(y bastante), gtracias por vuestros consejos....
Salu2
User avatar
Willi Quintana
 
Posts: 1023
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 22 guests