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: 1234
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: 7135
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: 1234
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: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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