Página 1 de 1

Compilação harbour

Enviado: 26 Mai 2011 12:49
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

Compilação harbour

Enviado: 26 Mai 2011 14:41
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

Compilação harbour

Enviado: 26 Mai 2011 14:50
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

Compilação harbour

Enviado: 26 Mai 2011 15:29
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

Compilação harbour

Enviado: 28 Mai 2011 18:48
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

Compilação harbour

Enviado: 13 Fev 2016 12:03
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)'

Compilação harbour

Enviado: 13 Fev 2016 13:00
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.

Compilação harbour

Enviado: 13 Fev 2016 13:11
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 :%

Compilação harbour

Enviado: 13 Fev 2016 14:09
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