Page 1 of 1

Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 9:45 am
by fgondi
Tengo una función que devuelve un array de 5 dimensiones ( por defecto {.F., '', {}, {}, {}} )

El problema es que el resultado que obtengo al llamar a la función es un array de 2 dimensiones, pero no me sucede todas las veces

aReturn := GeneraArr()
xBrowse( aReturn ) //=> {1, 5934020}

Es como si en lugar de devolver el array me devolviera el puntero del mismo, ya que el valor del segundo elemento (5934020) va cambiando.

Alguien me puede ayudar?

El mismo código con xHarbour siempre devuelve el array correcto

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 10:20 am
by hmpaquito
Fernando,

fgondi wrote:Tengo una función que devuelve un array de 5 dimensiones ( por defecto {.F., '', {}, {}, {}} )

Quizá quisiste decir "...un array de 5 elementos..." de 5 dimensiones seria asi como por ejemplo este {{{{{}}}}} :wink:

Mi experiencia con Harbour/xHarbour es: Si algo funcionaba con xHarbour y no con Harbour es porque era un comportamiento erroneo de xHarbour que yo asumia como bueno.
Normalmente los problemas que podemos tener con los arrays son derivados del hecho que los arrays son tratados por REFERENCIA y no por valor.
En tu caso, pareciera que la funcion xBrowse pudiera estar cambiando el array. Prueba asi:
Code: Select all  Expand view
xBrowse( aClone( aReturn ) )


Saludos

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 11:14 am
by fgondi
hmpaquito, muchas gracias por responder.

Es un array de 5 elementos, cierto :oops:


He probado aClone( aReturn ), y sigue devolviendo lo mismo. Incluso en el return ( return aClone(aReturn) )

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 12:04 pm
by hmpaquito
Fernando,

Realmente, creo que no entiendo lo que dices. ¿ Esperas que la funcion xBrowse te devuelva el valor que ya le pasas como parametro ? Si ya lo tienes antes de llamarla.

Pero si aún esto es así y como parece que lo que falla es la funcion xBrowse(), yo lo que haría sería:

Lleva a tu codigo la funcion xBrowse.
Luego "siembrala" de trazas con TRAZAS_(<cMsg>) y abre el archivo Trazas.txt para ver donde cambio.


Definicion de TRAZAS_
Code: Select all  Expand view
#Translate TRAZAS_(<cMsg>) => MemoWrit("Trazas.Txt", MemoRead("Trazas.Txt")+ CRLF+ <cMsg>))



Saludos.

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 12:33 pm
by Antonio Linares
Fernando,

Este ejemplo funciona bien:

Code: Select all  Expand view
#include "FiveWin.ch"
#include "xbrowse.ch"

function Main()

   local a := { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }

   XBrowse( a )

return nil


Fíjate que la función XBrowse() no lo muestra como un array multidimensional si todos sus elementos no lo son

Image

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 3:02 pm
by fgondi
Perdón, no me estoy explicando bien.
El problema no tiene nada que ver con xBrowse, uso xBrowse para ver que contiene el dichoso array

El problema está en lo que contiene el array
Pongo un ejemplo sencillo de lo que me pasa

Code: Select all  Expand view
Function Main()
  local aResult

  aResult := ps_Funcion()
  ? len(aResult)  //=>2 El contenido de aResult pasa a ser un array de 2 elementos
return nil

static func ps_Funcion()
local aResult := {'', '', {}, {}, {}}
aResult := ps_Funcion2()
? len(aResult)  //=> 5
return aResult


static func ps_Funcion2()
local aResult := {'', '', {}, {}, {}}
aResult[1] := .F.
aResult[2] := 'ahsdflasdf'
aadd( aResult[3], 'hola' )
return aResult
 


Desconozco porque me pasa esto a veces.
Por cierto el ejemplo que he escrito, lo he probado y funciona bien.

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 3:50 pm
by hmpaquito
Fernando,

Entenderás que si pones un ejemplo que te funciona, nosotros no encontremos problemas en él y por tanto poco podamos aportar para que soluciones tu problema, ¿ verdad ? :? :wink:
La clave está en la función GeneraArr() y subfunciones. Sin ver el código imposible, al menos yo.

Saludos

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 4:17 pm
by fgondi
Entenderás que si pudiera tener un ejemplo que no funciona, ya lo habría puesto desde el primer mensaje.

Mientras sigo intentando reproducirlo con un ejemplo mas sencillo, comunico lo que me pasa para saber si Harbour trabaja con los array's cuando son el resultado de una función, de forma distinta.
O en Harbour hay que prestar atención a si se devuelve de una forma en concreto.

El array que se obtiene parece que contiene una referencia de memoria, o algo paracecido.

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 5:25 pm
by fgondi
Ya he encontrado el problema.

Dentro de la función llamaba a hb_gcAll. Si comento esa línea funciona correcto.

He probado a colocar hb_gcall en el ejemplo descrito anteriormente y no falla. Me imagino porque no tiene que limpiar nada.

En mi caso, dentro de la función llamo al objecto Crystal Report para convertir un Report en pdf y después de cerrar el report llamaba a hb_gcall.

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 5:56 pm
by Antonio Linares
Fernando,

En vez de llamar a hb_gcAll() haz:

oCrystalReports := nil

asi no deberia fallar

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 6:05 pm
by Antonio Linares
Fernando,

Los reportes de FWH ya tienen soporte para salida en PDF, lo has probado ? :-)

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 6:50 pm
by hmpaquito
Fernando,


Buenoooooooo, como está hb_gcall... parece que tiene más peligro que una caja bombas.
En mi primer post te indiqué que hicieras trazas para ver donde fallaba. "Tracear" el programa ayuda a situarse más cerca del problema.

A mi me ha salvado alguna vez el hb_gcall cuando he usado intensivamente cadenas o arrays.

En todo caso, felicidades, no era fácil de encontrar. Y para todos: cuidadín con el hb_gcall().

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 6:53 pm
by Antonio Linares
Mi impresión es que es un problema combinado del uso de OLE y hb_gcAll(). El soporte de OLE en Harbour precisa "bloquear" un handle de memoria de Harbour, que en algún momento parece alterarse, por lo que comentas (a mi nunca se me ha presentado un caso asi ni es algo facil de reproducir).

Siempre insisto en esto: No usen componentes externos. Evítenlos siempre que puedan :-)

A la larga solo traen problemas. Y en especial el OLE puede resultar un campo de minas (no siempre) pues no tenemos el código fuente. Por ejemplo: no podemos debuggearlos a bajo nivel al no tener sus fuentes :-(

Re: Harbour y arrays en funciones

PostPosted: Tue Jul 02, 2013 8:56 pm
by fgondi
Muchas gracias por vuestro interes.

Antonio Linares wrote:Los reportes de FWH ya tienen soporte para salida en PDF, lo has probado ? :-)

No lo he probado, gracias por la información, es muy bueno saberlo y probarlo.
Aunque de momento no voy a cambiar de Crystal Report

Antonio Linares wrote:Siempre insisto en esto: No usen componentes externos. Evítenlos siempre que puedan

Sabio consejo, aunque creo que con determinadas opciones es mejor aprovecharlas que intentar inventar la rueda.
Si ya existe, es profesional y esta sobradamente contrastada, porque no usarla. P.E. Codejock, Crystal Report, Lead tools
Pienso que es mejor adaptar las librerias/compiladores para que se comunique con ella sin problemas.
Es muy bueno tenerlas propias, porque son de pago, y es una forma de tener una alternativa.
Pero sólo por ese motivo (que no es poco), no porque tengamos problemas en el entorno para usarlas.