Harbour y arrays en funciones

Harbour y arrays en funciones

Postby fgondi » Tue Jul 02, 2013 9:45 am

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
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Harbour y arrays en funciones

Postby hmpaquito » Tue Jul 02, 2013 10:20 am

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  RUN
xBrowse( aClone( aReturn ) )


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

Re: Harbour y arrays en funciones

Postby fgondi » Tue Jul 02, 2013 11:14 am

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) )
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Harbour y arrays en funciones

Postby hmpaquito » Tue Jul 02, 2013 12:04 pm

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  RUN
#Translate TRAZAS_(<cMsg>) => MemoWrit("Trazas.Txt", MemoRead("Trazas.Txt")+ CRLF+ <cMsg>))



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

Re: Harbour y arrays en funciones

Postby Antonio Linares » Tue Jul 02, 2013 12:33 pm

Fernando,

Este ejemplo funciona bien:

Code: Select all  Expand view  RUN
#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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Harbour y arrays en funciones

Postby fgondi » Tue Jul 02, 2013 3:02 pm

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  RUN
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
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Harbour y arrays en funciones

Postby hmpaquito » Tue Jul 02, 2013 3:50 pm

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

Re: Harbour y arrays en funciones

Postby fgondi » Tue Jul 02, 2013 4:17 pm

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.
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Harbour y arrays en funciones

Postby fgondi » Tue Jul 02, 2013 5:25 pm

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.
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Harbour y arrays en funciones

Postby Antonio Linares » Tue Jul 02, 2013 5:56 pm

Fernando,

En vez de llamar a hb_gcAll() haz:

oCrystalReports := nil

asi no deberia fallar
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Harbour y arrays en funciones

Postby Antonio Linares » Tue Jul 02, 2013 6:05 pm

Fernando,

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

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Harbour y arrays en funciones

Postby hmpaquito » Tue Jul 02, 2013 6:50 pm

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

Re: Harbour y arrays en funciones

Postby Antonio Linares » Tue Jul 02, 2013 6:53 pm

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 :-(
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42118
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Harbour y arrays en funciones

Postby fgondi » Tue Jul 02, 2013 8:56 pm

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.
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 53 guests