SOLUCIONADO Algo raro con un array

Post Reply
User avatar
Willi Quintana
Posts: 859
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú
Contact:

SOLUCIONADO Algo raro con un array

Post by Willi Quintana »

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

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
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Algo raro con un array

Post by cnavarro »

Willy, es estática la variable?
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Algo raro con un array

Post by hmpaquito »

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.
User avatar
hebert_j_vargas
Posts: 94
Joined: Thu Aug 02, 2012 3:21 pm

Re: Algo raro con un array

Post by hebert_j_vargas »

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

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

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
RenOmaS
Posts: 205
Joined: Fri Oct 07, 2005 5:07 pm

Re: Algo raro con un array

Post by RenOmaS »

Es mejor colocar asi la llamada.

Code: Select all

RelProductos(oMySQL, aDesPro, "QAZ123")
o

Code: Select all

aDesPro := RelProductos(oMySQL, "QAZ123")

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

skype: americo.balboa
User avatar
Willi Quintana
Posts: 859
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú
Contact:

SOLUCIONADO Re: Algo raro con un array

Post by Willi Quintana »

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 _... el manejo de los arrays en todos vuestros ejemplos y correcciones es correcto,,, mil disculpas.. :oops: :oops: :oops:
xmanuel
Posts: 613
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Contact:

Re: SOLUCIONADO Algo raro con un array

Post by xmanuel »

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


    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
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: SOLUCIONADO Algo raro con un array

Post by hmpaquito »

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
xmanuel
Posts: 613
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Contact:

Re: SOLUCIONADO Algo raro con un array

Post by xmanuel »

: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
User avatar
Willi Quintana
Posts: 859
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú
Contact:

Re: SOLUCIONADO Algo raro con un array

Post by Willi Quintana »

Gracias a todos,,, aquí siempre se aprende...(y bastante), gtracias por vuestros consejos....
Salu2
Post Reply