Incompatibilidade Save/Restore from ... Clipper x xHarbour

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

o xHarbour não é totalmente compativel com o clipper, seria até pedir de mais neh !!! hehehe...fazer o que alguma coisa tem que ser alterada mesmo !!! um dia chega lah !!!
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Em clipper, as variáveis com os tipos Array, Objeto, CodeBlock são ignoradas pelas instruções Save/Restore from .MEM conforme esperado, ou seja, nada ocorre com elas antes ou depois das instruções Save / Restore from, o mesmo deveria ocorrer em xHarbour, porém ele esta destruindo as variáveis, causando um enorme problema no sistema.
Eu não uso MEM nem a pau, mas pelo que lembro, o RESTORE apaga todas as variáveis públicas e privadas, a menos que se use a cláusula ADDITIVE.

Não sei qual o comportamento no Clipper, mas mesmo sem ADDITIVE, ele não deveria apagar uma variável local em outra função. O RESTORE apenas repõe (ou adiciona) variáveis no memory pool do sistema. Ele não mexe na pilha, onde as variáveis locais são armazenas (por valor ou referência). Sem dúvida, é um bug. Tão escabroso que provavelmente já deve ter um bug report registrado.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

o xHarbour não é totalmente compativel com o clipper, seria até pedir de mais neh !!!
Não é. No que pese o princípio da retro-compatibilidade de *quase* 100%, isso é um bug bem feio. Deveria ser tratado com prioridade.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Mensagem por Itamar M. Lins Jr. »

Maligno escreveu:
o xHarbour não é totalmente compativel com o clipper, seria até pedir de mais neh !!!
Não é. No que pese o princípio da retro-compatibilidade de *quase* 100%, isso é um bug bem feio. Deveria ser tratado com prioridade.
Concordo.

É melhor reportar esse bug na lista de bugs.
http://www.xharbour.com/support/bugrepo ... p?page=add

Ou no news:
http://groups.google.com.br/group/comp. ... s?hl=pt-BR

Se é que é um bug mesmo.

Saudações
Itamar M. Lins Jr.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Se é que é um bug mesmo.
Não testei, mas pelo comentário do Éric, só pode ser. Um RESTORE não pode destruir uma variável local que reside em outra função. Observe: a variável GetList, de escopo local, não está na função onde RESTORE é executado. Ainda assim, GetList é destruída. Uma ação fora de escopo.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

É bug mesmo, só pode ser.
Não é que ele destroi variaveis, o comando "save to ... " simplesmente não salva o conteudo da variavel no .mem.
Já fiz uma rotinazinha boba aqui só para testar isso e não funciona.
Ele até cria o arquivo, mas o conteudo não !
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Não. O comando SAVE (do Clipper) não salva variáveis locais, mesmo que se queira. Está no NG. Por isso, o que ocorre é a destruição mesmo, pelo uso do comando RESTORE. Esse comando apenas e tão somente cria variáveis PRIVATE com o conteúdo do arquivo MEM gerado. Ele não deveria alterar em nada qualquer variável local. Ainda mais fora do escopo da função onde o comando é executado.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

O interessante é que depois de tanto tempo, só agora entrou esse bug report? Será que ninguém, em lugar algum, passou pelo mesmo problema? :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

ericmagaldi escreveu:O exemplo abaixo é com GetList, mas acontecerá com todas as outras variáveis públicas/privadas do tipo citado.
Não me ative atentamente ao seu código, Éric. Por isso, acho que me precipitei. No seu código de teste a variável GetList é local para Main(). Ao ser executada a função ArqMem(), GetList fica invisível, claro. Então nesta função, GetList não é destruída. Ou é? Mas você não testou se em Main() a GetList ainda existe, testou? Nota: não uso xHarbour e por isso não testei e nem vou testar.

A sua preocupação quanto a destruição das variáveis públicas e privadas não procede, já que este é o comportamento normal de RESTORE. No Clipper, pelo menos. A não ser que se use a cláusula ADDITIVE, que você não usou no seu código de teste.

O que eu disse antes foi com relação ao que você descreveu como a destruição da GetList local por uma outra função, fora do escopo da variável. Isso sim seria anormal. Mas hoje, dando uma passeada no fórum, vi seu link para o bug report e percebi que você tinha errado na descrição que está como "Restore from .mem, destroy all variables public type Array", que é uma descrição diferente da que o Culik usou. Acabei olhando melhor seu código e percebi que talvez tenhamos analisado incorretamente o caso.

O X da questão é Getlist como uma variável local, que não deveria ser destruída. Veja que a GetList usada em TesteGet1() tem de ser destruída mesmo, já que ela não é local. Note que temos duas GetList neste caso. A local, de Main() e a de TesteGet1(). Portanto, teste apenas se a GetList local de Main() está mesmo sendo destruída. Se não estiver, ótimo. Não há bug nisso. Seria então só o caso de testar as variáveis públicas e privadas (incluindo a GetList de TesteGet1()) mas com o uso da cláusula ADDITIVE. Se ainda assim, estiverem sendo destruídas, é bug mesmo. Caso contrário, foi só uma mera distração. Isso pelo menos explicaria o fato de um bug tão grosseiro nunca ter sido reportado antes. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Acredite: entendi qual é sua reclamação. Mas, uma vez que o RESTORE do XHarbour também dispõe da cláusula ADDITIVE e você não a incluiu no seu código de teste, ficou a dúvida: com ADDITIVE a GetList não-local é destruída assim mesmo? E outra pergunta: a GetList local (a de Main() - lembre-se: há duas) é destruída em qualquer caso? Se a resposta a qualquer uma das perguntas for sim, aí concordo, existe um bug. Se para ambas a resposta for não, então o comportamento que se tem é exatamente o esperado, conforme os helps do Clipper e do XHarbour.
Sugiro-lhe que aguarde mais um pouco, até obtivermos alguma novidade sobre o assunto.
Sem problema. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Responder