Harbour y arrays en funciones
Harbour y arrays en funciones
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
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
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
Fernando González Diez
ALSIS Sistemas Informáticos
Re: Harbour y arrays en funciones
Fernando,
Quizá quisiste decir "...un array de 5 elementos..." de 5 dimensiones seria asi como por ejemplo este {{{{{}}}}}
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:
Saludos
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 {{{{{}}}}}

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
xBrowse( aClone( aReturn ) )
Saludos
Re: Harbour y arrays en funciones
hmpaquito, muchas gracias por responder.
Es un array de 5 elementos, cierto
He probado aClone( aReturn ), y sigue devolviendo lo mismo. Incluso en el return ( return aClone(aReturn) )
Es un array de 5 elementos, cierto

He probado aClone( aReturn ), y sigue devolviendo lo mismo. Incluso en el return ( return aClone(aReturn) )
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
Fernando González Diez
ALSIS Sistemas Informáticos
Re: Harbour y arrays en funciones
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_
Saludos.
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
#Translate TRAZAS_(<cMsg>) => MemoWrit("Trazas.Txt", MemoRead("Trazas.Txt")+ CRLF+ <cMsg>))
Saludos.
- Antonio Linares
- Site Admin
- Posts: 42521
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 75 times
- Contact:
Re: Harbour y arrays en funciones
Fernando,
Este ejemplo funciona bien:
Fíjate que la función XBrowse() no lo muestra como un array multidimensional si todos sus elementos no lo son

Este ejemplo funciona bien:
Code: Select all | Expand
#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

Re: Harbour y arrays en funciones
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
Desconozco porque me pasa esto a veces.
Por cierto el ejemplo que he escrito, lo he probado y funciona 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
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.
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
Fernando González Diez
ALSIS Sistemas Informáticos
Re: Harbour y arrays en funciones
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 ?
La clave está en la función GeneraArr() y subfunciones. Sin ver el código imposible, al menos yo.
Saludos
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 ?


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
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.
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.
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
Fernando González Diez
ALSIS Sistemas Informáticos
Re: Harbour y arrays en funciones
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.
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.
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
Fernando González Diez
ALSIS Sistemas Informáticos
- Antonio Linares
- Site Admin
- Posts: 42521
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 75 times
- Contact:
Re: Harbour y arrays en funciones
Fernando,
En vez de llamar a hb_gcAll() haz:
oCrystalReports := nil
asi no deberia fallar
En vez de llamar a hb_gcAll() haz:
oCrystalReports := nil
asi no deberia fallar
- Antonio Linares
- Site Admin
- Posts: 42521
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 75 times
- Contact:
Re: Harbour y arrays en funciones
Fernando,
Los reportes de FWH ya tienen soporte para salida en PDF, lo has probado ?
Los reportes de FWH ya tienen soporte para salida en PDF, lo has probado ?

Re: Harbour y arrays en funciones
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().
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().
- Antonio Linares
- Site Admin
- Posts: 42521
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 75 times
- Contact:
Re: Harbour y arrays en funciones
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
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
Muchas gracias por vuestro interes.
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
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.
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.
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
Fernando González Diez
ALSIS Sistemas Informáticos