Compilação harbour

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

Moderador: Moderadores

MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Compilação harbour

Mensagem por MARCELOG »

Olá pessoal,
há pouco tempo passei a utilizar o harbour em meus projetos, fazendo a migração.
Com relação a Minigui, antes utilizada em conjunto com o xharbour, foi tranquilo.
Recentemente passei a testar a hbqt em face da promessa de multiplataforma.
Estou gostando do resultado, haja vista o controle total dos objetos criados.
Todavia, os testes indicam a utilização da switch w3, ou seja, nível de aviso 3.
Nesse contexto, tive problema de compilação.
Ao que parece, com o switch w3, embora referindo-se a aviso, a compilação não é executada.
Pela internet, ví que o procedimento abaixo encontra-se errado:
http://hmgforum.com/viewtopic.php?f=5&t=1756

procedure main()
local x:=''

if verdade
x:='teste'
endif

return

Devendo ser:

procedure main()
local x:=''

if verdade
x+='teste'
endif

return

Fazer o quê né...

Ontem (nem vou dizer a data), aconteceu o seguinte:

Prg1
procedure main()
local x

x:=functionprg2()

return

Prg2
function functionprg2()
return 'teste'

Deu erro de "ambiguous reference".

A mesma coisa acontece se eu declarar x como privante no primeiro prg e definir o seu valor no segundo.

Então, para processar a compilação, tive que passar o switch de aviso para 0, ou seja, w0.

Isso pode prejudicar o funcionamento do sistema em tempo de execução?

Desde já obrigado.

MarceloG
Água mole em pedra dura tanto bate que até espirra!
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Compilação harbour

Mensagem por asimoes »

Marcelo,

Nos testes que eu fiz aqui a coisa funciona assim:

Primeiro você declara a variável sem inicializar:

private x
ou
local x

Depois inicializa a variável:

x:=""

Código: Selecionar todos

procedure main()
local x'

if verdade
x:='teste'
endif

return
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Compilação harbour

Mensagem por asimoes »

Marcelo,

Corrigindo:

Para não dá o warning ambiguous reference fiz assim:

exemplo:

private x

memvar->x:=""

ou

public x

memvar->x:=""

Teste()

function teste
memvar x
x:="abc"
return nil


[]´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Compilação harbour

Mensagem por asimoes »

Marcelo,

Tem mais,

usando assim também:

Código: Selecionar todos

memvar x
function main
x:="teste"
return Nil
ou

Código: Selecionar todos

function main
memvar x
local y:=""
x:=""
return nil
Segundo a documentação do (x)harbour o memvar declara PRIVATE ou PUBLIC variáveis

exemplo da documentação:

Código: Selecionar todos

// The example demonstrates the difference of a declared and
// undeclared memory variable of PRIVATE scope.

   MEMVAR myVar

   PROCEDURE Main
      x := "myVar"              // compiler warning
      myVar := "Hello World"    // no compiler warning

      ? x
      ? &x
   RETURN
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Compilação harbour

Mensagem por MARCELOG »

Olá pessoal,
obrigado "asimoes" por resolver o problema.
Com base na sua dica pesquisei e verifiquei que as variáveis public e private devem ser declaradas MEMVAR nos prg´s em que são utilizadas.
Ao que parece a situação é necessária para o compilador não tentar resolver os conflitos verificados quando da compilação, já que o valor somente será efetivamente conhecido quando da execução.
Também verifiquei que a opçao -w3 informa ao compilador para admitir como um erro qualquer aviso e não gerar o executável.
É interessante a situação verificada, porque utilizando o xharbour não tive qualquer problema dessa natureza.
Ou melhor, não recebi nenhum aviso dessa natureza.
Todavia, ao que parece, o procedimento é correto e ajuda o programador a "não errar".

Obrigado a todos.

MarceloG
Água mole em pedra dura tanto bate que até espirra!
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Compilação harbour

Mensagem por microvolution »

asimoes escreveu:Para não dá o warning ambiguous reference fiz assim:
então prezado "asimoes"...
estou testando e vi este post e resolvi alterar, gastei do tempo umas 4 horas mudando tudo.
fiz tudo quanto é mudança para testar o -w3 -es2, e, agora estão aparecendo as mensagens de erro:

Código: Selecionar todos

exvd-v30.prg(1234) Warning W0032  Variable 'NTT_REG' is assigned but not used in function 'PDEL_PREST(796)'
exvd-v30.prg(1234) Warning W0032  Variable 'N3' is assigned but not used in function 'PDEL_PREST(796)'
exvd-v30.prg(1234) Warning W0032  Variable 'N4' is assigned but not used in function 'PDEL_PREST(796)'
exvd-v30.prg(1234) Warning W0032  Variable 'NVRMJRS' is assigned but not used in function 'PDEL_PREST(796)'
exvd-v30.prg(1234) Warning W0032  Variable 'NVRDESCONT' is assigned but not used in function 'PDEL_PREST(796)'
exvd-v30.prg(1234) Warning W0032  Variable 'NVR_RECEBI' is assigned but not used in function 'PDEL_PREST(796)'
exvd-v30.prg(1234) Warning W0032  Variable 'NVRTITUTLO' is assigned but not used in function 'PDEL_PREST(796)'
exvd-v30.prg(1234) Warning W0032  Variable 'CDT_INIC' is assigned but not used in function 'PDEL_PREST(943)'
exvd-v30.prg(1695) Warning W0032  Variable 'COPCAO' is assigned but not used in function 'PDEL_VENDA(1265)'
exvd-v30.prg(1695) Warning W0032  Variable 'NTT_REG' is assigned but not used in function 'PDEL_VENDA(1265)'
exvd-v30.prg(1695) Warning W0032  Variable 'N3' is assigned but not used in function 'PDEL_VENDA(1265)'
exvd-v30.prg(1695) Warning W0032  Variable 'N4' is assigned but not used in function 'PDEL_VENDA(1265)'
exvd-v30.prg(1695) Warning W0032  Variable 'COP' is assigned but not used in function 'PDEL_VENDA(1265)'
exvd-v30.prg(1695) Warning W0032  Variable 'LTESTE' is assigned but not used in function 'PDEL_VENDA(1265)'
exvd-v30.prg(1695) Warning W0032  Variable 'CDT_INIC' is assigned but not used in function 'PDEL_VENDA(1373)'
exvd-v30.prg(3145) Warning W0032  Variable 'NUM_CHAVES' is assigned but not used in function 'ABRE_ARQUIVO(3049)'
exvd-v30.prg(3145) Warning W0032  Variable 'I' is assigned but not used in function 'ABRE_ARQUIVO(3049)'
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Compilação harbour

Mensagem por sygecom »

São variaveis declaradas que não estão sendo usadas.
Por exemplo no primeiro erro na FUNCTION PDEL_PRES linha 796 tem uma variável NTT_REG que não usa dentro da FUNCTION, remove ela que deve resolver.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

Compilação harbour

Mensagem por microvolution »

sygecom escreveu:Por exemplo no primeiro erro na FUNCTION PDEL_PRES linha 796 tem uma variável NTT_REG que não usa dentro da FUNCTION, remove ela que deve resolver.
também pensava e continuo pensando semelhante...
só que se fizer isso, vem a infeliz notícia: AMBIGUOS REFERENCE NTT_REG...
rsrs :%
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Compilação harbour

Mensagem por JoséQuintas »

Pra simplificar essa parte de PUBLIC e PRIVATE declare no início do FONTE, não no início de um módulo.

Código: Selecionar todos

MEMVAR suavariavel

PROCEDURE algo
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder