Migracion a Harbour

Migracion a Harbour

Postby hmpaquito » Thu Mar 09, 2017 1:04 pm

Hola a todos,

Estoy intentando migrar un programa a Harbour.
Pero en el mismo codigo donde xHarbour trabaja bien, Harbour, a veces, se le va la cabeza y da error.

Es algo relacionado a parametros y codeblocks. Se me ha dado ya algunas veces.
Un parametro, en este caso array, no recuerdo si de otro tipo tambien da problema, llega un momento que pierde su valor y se pone a NIL

El escenario para producir el error es mas o menos asi:

Code: Select all  Expand view  RUN
FUNCTION Noname()
Local nI
Local a:= {"algo"}
FOR nI:= 1 TO 100
   NoName2(a)
NEXT
RETURN NIL

FUNCTION NoName2(a)
Local b:= {|| msginfo( Str(len(a)) ) }  // <----- Aqui la variable a, llegado un momento determinado, sin razón alguna, tiene el valor NIL
Eval(b)
RETURN NIL 


En cambio, si el parametro lo asigno a local, el problema desaparece.

Code: Select all  Expand view  RUN
FUNCTION Noname()
Local nI
Local a:= {"algo"}
FOR nI:= 1 TO 100
   NoName2(a)
NEXT
RETURN NIL

FUNCTION NoName2(aPar)
Local a:= aPar           // <--- Esta asignacion del parametro renombrado como variable local hace que ya no se produzca error.
Local b:= {|| msginfo( Str(len(a)) ) }
Eval(b)
RETURN NIL 

Mayormente lo pregunto por si a alguien le ha pasado.

Saludos
Last edited by hmpaquito on Thu Mar 09, 2017 1:36 pm, edited 2 times in total.
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Migracion a Harbour

Postby joseluisysturiz » Thu Mar 09, 2017 1:21 pm

Buen dia, prueba quitando la VAR LOCAL 'nI' de la funcion NoName2() que es igual al del FOR aunque esten en funciones diferentes, es solo una idea, hay cosas de programacion que son tontas y a veces son las mas dificiles de ver o entender...es lo unico que se me ocurreo, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Migracion a Harbour

Postby hmpaquito » Thu Mar 09, 2017 1:35 pm

joseluisysturiz wrote:Buen dia, prueba quitando la VAR LOCAL 'nI' de la funcion NoName2() que es igual al del FOR aunque esten en funciones diferentes, es solo una idea, hay cosas de programacion que son tontas y a veces son las mas dificiles de ver o entender...es lo unico que se me ocurreo, saludos... :shock:



Gracias por tu interés pero eso es solo un error en la preparacion del codigo de demo. Voy a ponerlo bien.

Estoy casi seguro que el error está en Harbour, porque con xHarbour no me ocurre. Ademas la situacion se me ha dado en diferentes procesos, y ademas el arreglo para que trabaje, es declarando una local para que coja el valor del parametro, que en xHarbour/ Harbour/ Clipper, es equivalente, o deberia serlo, a la declaracion de parametros entre los parentesis.
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Migracion a Harbour

Postby karinha » Thu Mar 09, 2017 1:42 pm

Code: Select all  Expand view  RUN

#include "FiveWin.ch"

MEMVAR nI

FUNCTION Noname()

   Local a:= {"algo"}

   FOR nI:= 1 TO 10 // 100
      NoName2(a)
   NEXT

RETURN NIL

FUNCTION NoName2(a)

   Local b:= {|| msginfo( Str(len(a)) ) }  // 1

   Eval(b)

RETURN NIL
 
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7872
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Migracion a Harbour

Postby cnavarro » Thu Mar 09, 2017 2:41 pm

Tu primera version no me ha dado ningún problema, pero puedes probarlo asi?

Code: Select all  Expand view  RUN


FUNCTION Noname()
Local nI
Local a:= {"algo"}
FOR nI:= 1 TO 100
   NoName2(a)
NEXT
RETURN NIL

FUNCTION NoName2(aPar)
Local b:= { | a | msginfo( Str(len(a)) ) }
Eval(b, aPar)
RETURN NIL

 
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: Migracion a Harbour

Postby José Luis Sánchez » Thu Mar 09, 2017 5:26 pm

Hola,
me suena a un tema de 'detached locals', mira esta entrada de un viejo bloguero http://webcache.googleusercontent.com/s ... clnk&gl=es El artículo ha sido borrado, tienes que buscarlo en el caché de google.

Saludos,
User avatar
José Luis Sánchez
 
Posts: 556
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España

Re: Migracion a Harbour

Postby hmpaquito » Fri Mar 10, 2017 11:47 am

Hola a todos,

Os agradezco sinceramente vuestra ayuda.

Estoy casi seguro que hay un problema con Harbour. ¿ Por qué lo creo así ? Pues porque, como hace el ejemplo 2, simplemente declarando el parametro como variable Local el problema desaparece.
Es una pena que no haya podido encontrar un ejemplo autocontenido que lo muestre, aunque los ejemplos si reflejan el esquema en donde se da el problema: llamadas reiteradas a funcion con parametro y ese parametro es usado en un codeblock dentro de la funcion llamada.

José Luis,

He visto el enlace. Muy bueno, gracias. Pero para resumir, lo que dice el articulo es que Clipper y xHarbour tienen un pequeño fallo con las detached locals, que Harbour SI tiene corregido. Yo en cambio digo que el fallo lo tiene Harbour.
PD. La encuesta: buenisima, pero ¿ para cuando un articulo con las conclusiones (tuyas) de la encuesta ? :D

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

Re: Migracion a Harbour

Postby horacio » Sat Mar 11, 2017 1:49 pm

Con tu ejemplo no he podido reproducir el error, lo he echo iterar un millón de veces y funciona perfectamente.

Saludos
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Migracion a Harbour

Postby hmpaquito » Sun Mar 12, 2017 11:11 am

horacio wrote:Con tu ejemplo no he podido reproducir el error, lo he echo iterar un millón de veces y funciona perfectamente.

Saludos


Horacio,

Gracias por tu prueba. Yo tampoco he conseguido un ejemplo autocontenido del mal funcionamiento.

Las situaciones reales donde el problema se da son trozos de código más complejos que los expuestos, pero que siguen el mismo esquema.
Sé que el problema debe existir porque, como ya comenté, se soluciona simplemente declarando el parámetro como una variable LOCAL y asignándole el valor.

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

Re: Migracion a Harbour

Postby xmanuel » Sun Mar 12, 2017 10:28 pm

No sé si es el mismo caso que me pasó a mi hace un tiempo...

Por casualidad tienes alguna función hecha en lenguaje C... le pasas algún valor por referencia?

Aunque no me gusta la solución que te voy a dar, a mi me funcionó.

Mira haz la siguiente modificacion:
Code: Select all  Expand view  RUN

static a // <--- Declara como static antes de la primera funcion, y no tendrás que psarla porque será visible en todo el PRG
FUNCTION Noname()
Local nI
a:= {"algo"} // <--- Solo hay que darle el valor
FOR nI:= 1 TO 100
   NoName2() // <--- No hay que pasarla
NEXT
RETURN NIL

FUNCTION NoName2()  // <--- No hay que pasarla
Local b:= {|| msginfo( Str(len(a)) ) }  // <----- Aqui la variable a, llegado un momento determinado, sin razón alguna, tiene el valor NIL
Eval(b)
RETURN NIL
 

Yo tenia una función hecha en C que recibía la variable por referencia y cuando entraba en un GET perdia la referencia y con esto se solucionaba :D
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 763
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: Migracion a Harbour

Postby hmpaquito » Mon Mar 13, 2017 8:07 am

Hola Manuel,

Gracias por tu interés.

La solución que voy dando cuando encuentro el problema es declarar una variable LOCAL que tome el valor del parámetro.

En general, salvo prisas, a veces tambien por clarificacion del codigo, procuro no usar variables STATIC porque impiden la reentrada; es decir, darian problemas si se entrara mas de una vez al fuente donde habitan.

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

Re: Migracion a Harbour

Postby horacio » Tue Mar 14, 2017 12:52 am

Yo utilizo variables static y no he tenido problemas. Muchas de mis rutinas utilizan variables static con el mismo nombre en distintas módulos y no me han generado errores. Puedes aclarar tu afirmación. Gracias.
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Migracion a Harbour

Postby hmpaquito » Tue Mar 14, 2017 8:16 am

horacio wrote:Yo utilizo variables static y no he tenido problemas. Muchas de mis rutinas utilizan variables static con el mismo nombre en distintas módulos y no me han generado errores. Puedes aclarar tu afirmación. Gracias.



https://groups.google.com/forum/?fromgr ... xJYnlma9EJ
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Migracion a Harbour

Postby Carlos Mora » Tue Mar 14, 2017 10:59 am

Paquito,

Creo que hay una muy mala interpretación de los eventuales problemas con las STATICs. Cuando Przemek se refiere a los problemas de reentrada no quiere decir que vuelvas a llamar a alguna función del prg , sino que EN EL CONTEXTO DE MULTITASKING, mientras una función se está ejecutando y alterando el valor de la STATIC, otro hilo podría entrar EN LA MISMA FUNCION SIMULTANEAMENTE y alterar el valor de la misma STATIC.
Por poner una analogía, imaginate el problema que tendríamos si pudiésemos acceder a modificar registros en una base de datos compartida sin necesidad de bloqueo. Pues lo mismo pero con variables de memoria STATIC, y siempre en el contexto de MT, cosa que no suele suceder (al menos yo no programo con MT).
La sugerencia de Przemek es utilizar técnicas más avanzadas para encarar los problemas de STATIC, pero problemas que no tenemos a menos que estemos usando MT. De hecho el mismo, en su respuesta, explica que usa STATICs en una librería de pdfs. Y como técnica más avanzada para evitar esto de las STATICs, se pueden usar variables o DATAs de CLASE (CLASS VARS)
Un ejemplo más en favor de las STATICs: Si miramos el código preprocesado de una clase cualquiera, incluyendo cualquiera de las de FW, verás que el comando CLASS <myclass> genera una funcion QUE INCLUYE UNA STATIC. Lo puedes corroborar en el 'hbclass.ch', en la definición del comando.

PD: Creo que el nombre "Przemek" significa "Paquito" en polaco :D
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Migracion a Harbour

Postby hmpaquito » Tue Mar 14, 2017 12:12 pm

Estimado Carlos,

Entiendo que te refieres a Viktor. Przemek no aparece en el hilo.

Por otra parte. Imagínate un extracto de artículos vendidos a todos los clientes. Estando sobre una linea, pulsas y te muestra un nuevo extracto con los articulos vendidos al cliente de la linea.

Ahí hay reentrada, incluso en modo ST. El uso de static en esas condiciones dará lugar a errores, sino se lleva cuidado.

Saludos

PD 1. Si el santo de Przemyslaw se puede celebrar el 13 de Abril, el 4 de Septiembre, el 10 de Octubre y el 30 de Octubre, el 10 de Octubre coincide con la fecha de la onomástica de San Francisco de Borja.
PD 2. Ya tengo en marcha la exportacion mysql rapida y desatendida solo con codigo prg. :)
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Next

Return to FiveWin para Harbour/xHarbour

Who is online

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