Página 1 de 1

bug Harbour ???

Enviado: 06 Mai 2020 11:33
por JoséQuintas
Alguém poderia testar isto no Harbour 3.2:

Código: Selecionar todos

PROCEDURE PCONTREL0010

   LOCAL nOpcGeral := 1

   nOpcGeral       := 1
   Test( @nOpcGeral )

   RETURN

FUNCTION Test( ... )
   RETURN NIL
Compilar usando -w3 -es2

Deveria emitir o alerta de nOpcGeral sendo atribuída de forma inútil.
Sem o @ na chamada de função o alerta aparece.

test.prg:10: warning W0032 Variable 'NOPCGERAL' is assigned but not used in function '3:PCONTREL0010'

bug Harbour ???

Enviado: 06 Mai 2020 12:19
por JoséQuintas
Baixei o harbour nightly.
Acontece a mesma coisa.

Faz tempo que percebi esse problema, mas só agora encontrei o motivo, e uma forma simples de demonstrar.

Código: Selecionar todos

PROCEDURE PCONTREL0010

   LOCAL nOpcGeral := 1

   nOpcGeral := 1
   nOpcGeral := 1
   nOpcGeral := 1
   nOpcGeral := 1
   Test( nOpcGeral )

   RETURN

FUNCTION Test( ... )
   RETURN NIL
d:\temp>harbour test.prg -w3 -es2 -n
Harbour 3.2.0dev (r2004201301)
Copyright (c) 1999-2020, https://harbour.github.io/
Compiling 'test.prg'...
test.prg(13) Warning W0032 Variable 'NOPCGERAL' is assigned but not used in function 'PCONTREL0010(3)'
test.prg(13) Warning W0032 Variable 'NOPCGERAL' is assigned but not used in function 'PCONTREL0010(5)'
test.prg(13) Warning W0032 Variable 'NOPCGERAL' is assigned but not used in function 'PCONTREL0010(6)'
test.prg(13) Warning W0032 Variable 'NOPCGERAL' is assigned but not used in function 'PCONTREL0010(7)'

No code generated.
Deveria ter a mesma mensagem ao usar por referência, já que as atribuições de valor continuam inúteis.
Mas ao usar por referência....
d:\temp>harbour test.prg -w3 -es2 -n
Harbour 3.2.0dev (r2004201301)
Copyright (c) 1999-2020, https://harbour.github.io/
Compiling 'test.prg'...
Lines 14, Functions/Procedures 2
Generating C source output to 'test.c'... Done.

bug Harbour ???

Enviado: 07 Mai 2020 10:01
por Kapiaba
Mister Quintas, não entendo donde quereis chegar. Nem na época de aprendiz, escreveria assim. Mas, como não aprendi CLIPPER em Summer-87, e sim em CLIPPER 5.3, talvez ai, minha dificuldade em acompanhá-lo. Modo arcaico, não entendo.

Código: Selecionar todos

// FWH\SAMPLES\QUINTAS.PRG

#include "FiveWin.ch"

FUNCTION PCONTROLE()

   LOCAL nOpcGeral := 0  // SE E NUMERICO INICIE COM 0.

   nOpcGeral := 1

   ? Test( nOpcGeral )

RETURN NIL

FUNCTION Test( nOpcGeral )

RETURN( nOpcGeral )
Abs

Saidações.

bug Harbour ???

Enviado: 07 Mai 2020 10:20
por JoséQuintas
Pois é... não entendeu pra que serve -w3 -es2.
Seu fonte contém o erro que mencionei.

Pra que atribuir zero, à variável que vai atribuir 1 ???
É isso que a compilação -w3 -es2 alerta.

Apenas coloquei várias vezes pra dar destaque à situação.

Código: Selecionar todos

PROCEDURE Main

   LOCAL nOpcGeral := 0

   nOpcGeral := 1
   Test( nOpcGeral )

   RETURN

FUNCTION Test( ... )
   RETURN NIL
d:\temp>hbmk2 test -w3 -es2 -n
hbmk2: Processando opções do ambiente: -comp=mingw
hbmk2: Processando arquivo de configuração: d:\harbour\bin\hbmk.hbc
Harbour 3.4.0dev (0e13c7c08d) (2019-09-09 14:45)
Copyright (c) 1999-2019, https://github.com/JoseQuintas/harbour-core/
Compiling 'test.prg'...

test.prg:10: warning W0032 Variable 'NOPCGERAL' is assigned but not used in function '3:MAIN'

No code generated.
O alerta some, se alterar pra test( @nOpcGeral )
Mas... continua sendo inútil atribuir valor 2 vezes.

bug Harbour ???

Enviado: 07 Mai 2020 10:31
por JoséQuintas
Mais simples ainda:

Código: Selecionar todos

PROCEDURE Main

   LOCAL nOpcGeral := 0

   nOpcGeral := 1
   nOpcGeral := 1
   ? nOpcGeral

   RETURN
d:\temp>hbmk2 test -w3 -es2 -n
hbmk2: Processando opções do ambiente: -comp=mingw
hbmk2: Processando arquivo de configuração: d:\harbour\bin\hbmk.hbc
Harbour 3.4.0dev (0e13c7c08d) (2019-09-09 14:45)
Copyright (c) 1999-2019, https://github.com/JoseQuintas/harbour-core/
Compiling 'test.prg'...

test.prg:10: warning W0032 Variable 'NOPCGERAL' is assigned but not used in function '3:MAIN'

test.prg:10: warning W0032 Variable 'NOPCGERAL' is assigned but not used in function '5:MAIN'

No code generated.

Código: Selecionar todos

PROCEDURE Main

   LOCAL nOpcGeral := 0

   nOpcGeral := 1
   nOpcGeral := 1
   ? @nOpcGeral

   RETURN
d:\temp>hbmk2 test -w3 -es2 -n
hbmk2: Processando opções do ambiente: -comp=mingw
hbmk2: Processando arquivo de configuração: d:\harbour\bin\hbmk.hbc
Harbour 3.4.0dev (0e13c7c08d) (2019-09-09 14:45)
Copyright (c) 1999-2019, https://github.com/JoseQuintas/harbour-core/
Compiling 'test.prg'...
Lines 9, Functions/Procedures 1
Generating C source output to 'C:\Users\jmcqu\AppData\Local\Temp\hbmk_figgfw.dir\test.c'... Done.
Então.. não era pra terem sumido os alertas.

bug Harbour ???

Enviado: 07 Mai 2020 10:40
por JoséQuintas
Só acrescentando:

É por isso que chamo a compilação -w3 -es2 de tolerância zero.
Ela obriga a deixar o fonte limpo, e sem possíveis causas de erro.

Parece ser bobeira esse alerta, mas...
Imagine isso num fonte de 2.000 linhas.
De repente você está olhando a variável começar com um valor, e o problema é no meio dessas 2.000 linhas ele estar sendo outro.
Poderia ser o cálculo de ICMS, IPI, total da nota, etc.
Você pode ter vários cálculos para a mesma variável, e ficar difícil encontrar o problema, justamente porque um anula o outro.

um exemplo com esse tipo de coisa:

Código: Selecionar todos

PROCEDURE Main

   LOCAL nOpcGeral := 0, nTotal

   nTotal := nOpcGeral * 2
   nTotal := nOpcGeral * 3
   ? nTotal

   RETURN
d:\temp>hbmk2 test -w3 -es2 -n
hbmk2: Processando opções do ambiente: -comp=mingw
hbmk2: Processando arquivo de configuração: d:\harbour\bin\hbmk.hbc
Harbour 3.4.0dev (0e13c7c08d) (2019-09-09 14:45)
Copyright (c) 1999-2019, https://github.com/JoseQuintas/harbour-core/
Compiling 'test.prg'...

test.prg:10: warning W0032 Variable 'NTOTAL' is assigned but not used in function '5:MAIN'

No code generated.

Código: Selecionar todos

PROCEDURE Main

   LOCAL nOpcGeral := 0, nTotal

   nTotal := nOpcGeral * 2
   nTotal := nOpcGeral * 3
   ? @nTotal

   RETURN
d:\temp>hbmk2 test -w3 -es2 -n
hbmk2: Processando opções do ambiente: -comp=mingw
hbmk2: Processando arquivo de configuração: d:\harbour\bin\hbmk.hbc
Harbour 3.4.0dev (0e13c7c08d) (2019-09-09 14:45)
Copyright (c) 1999-2019, https://github.com/JoseQuintas/harbour-core/
Compiling 'test.prg'...
Lines 9, Functions/Procedures 1
Generating C source output to 'C:\Users\jmcqu\AppData\Local\Temp\hbmk_w9ullv.dir\test.c'... Done.

bug Harbour ???

Enviado: 07 Mai 2020 11:53
por Kapiaba
Não importa o modo que compilas, o bom programador, escreve de cima para baixo e de baixo para cima. O bom programador cria a melhor solução, não "inventa". Faz exatamente o que o cliente quer e não o que ele quer. Assim, saem os excelentes sistemas. Sistema ótimo/excelente, é aquele que o skype não chama, o telefone não toca. O programa fala por si... Esse cara sou eu!!! kkkkkkkkkkkkkkkkkkkkkkkk, Tais na quarentena sem fazer nada, enquanto eu estou me matando em "Mulher Office"? - Dilma Russel. kkkkkkkkkkkk, abs.

bug Harbour ???

Enviado: 07 Mai 2020 13:08
por JoséQuintas
Kapiaba escreveu:O bom programador cria a melhor solução, não "inventa"
Mas... isso não é inventar? kkkkk
Kapiaba escreveu: Sistema ótimo/excelente, é aquele que o skype não chama, o telefone não toca. O programa fala por si... Esse cara sou eu!!! kkkkkkkkkkkkkkkkkkkkkkkk, Tais na quarentena sem fazer nada, enquanto eu estou me matando em "Mulher Office"? - Dilma Russel. kkkkkkkkkkkk
Se o skype não chama, e o telefone não toca...... tá se matando porque? kkkkk

Eu uso compilação -w3 -es2, é só vantagem.

bug Harbour ???

Enviado: 07 Mai 2020 13:48
por Itamar M. Lins Jr.
Ola!
Entendi uma coisa, não entendi outra... depois voltei li,li pensei...

Aqui é a linha 3 "LOCAL nOpcGeral := 1" test.prg(13) Warning W0032 Variable 'NOPCGERAL' is assigned but not used in function 'PCONTREL0010(3)'
Aqui é a linha 5 "nOpcGeral := 1" test.prg(13) Warning W0032 Variable 'NOPCGERAL' is assigned but not used in function 'PCONTREL0010(5)'
Aqui é a linha 6 "nOpcGeral := 1" test.prg(13) Warning W0032 Variable 'NOPCGERAL' is assigned but not used in function 'PCONTREL0010(6)'
Aqui é a linha 7 "nOpcGeral := 1" test.prg(13) Warning W0032 Variable 'NOPCGERAL' is assigned but not used in function 'PCONTREL0010(7)'

Então a linha 8 "nOpcGeral := 1" é que está valendo. Que é a que não tem aviso(warning). A ultima linha que é atribuído, o resto é redundância.

Deveria a msg dizer, "unnecessary?" pq o código "nOpcGeral:=1" é executado sim, o programa executa, mas sempre vai acatar a ultima.
Eu estava sendo conduzido a pensar "pela msg de erro" em inglês, que o valor não estava sendo atribuído.
Como se colocássemos no inicio da função. "Local xyz" e não fizesse uso da variável "xyz" em lugar nenhum.

Demorou mais para entender a lógica que a linguagem usa, do que seu exemplo para demonstrar o bug.

Saudações,
Itamar M. Lins Jr.

bug Harbour ???

Enviado: 07 Mai 2020 15:27
por JoséQuintas
Itamar M. Lins Jr. escreveu:Eu estava sendo conduzido a pensar "pela msg de erro" em inglês, que o valor não estava sendo atribuído.
errou na tradução, apesar que nem sei qual seria a tradução mais exata.
Variable 'NOPCGERAL' is assigned but not used
variável nOpcGeral é atribuído valor mas NÃO é usado.

Se traduzir igual o google:
Variável é atribuída mas não é usada.... dá a impressão de que tá sobrando a variável, mas na verdade está sobrando a "atribuição".
Talvez mudar até em ingles:
variable nOpcGeral is assigned but value not used.

***editado pra uma mensagem alternativa mais curta.

bug Harbour ???

Enviado: 07 Mai 2020 15:58
por Itamar M. Lins Jr.
Ola!
Está sendo atribuído e está sendo usado. ASSIGNED = ATRIBUÍDO e USED = USADO
Neste caso é redundância mesmo.
Lembre-se que é um aviso! não é um erro. A mensagem diz uma coisa que na realidade não é.
ASSIGNED BUT NOT USED
A:=1
A:=2
A:=3
A:=4
1,2,3 é redundância, mas o compilador atribui e executa. Basta compilar sem "w3 es2 n"
O que é assigned na programação ?

Código: Selecionar todos

Function main
LOCAL cA  //Warning W0003  Variable 'CA' declared but not used in function 'MAIN(2)'
Return nil

Código: Selecionar todos

Function main
LOCAL cA :=1 //Warning W0032  Variable 'CA' is assigned but not used in function 'MAIN(2)'
Return nil
Veja ai as diferenças. Não é usado e nem atribuído(W0003) apenas declarado, depois é declaro é atribuído mas não é usado na função.(W0032)
A terceira possibilidade é o erro que vc achou, que é redundância.
Teria que ser W0033 etc... e não W0032. Cada aviso tem um WXXXX.

Saudações,
Itamar M. Lins Jr.

bug Harbour ???

Enviado: 07 Mai 2020 16:22
por Itamar M. Lins Jr.
Ola!
E ainda tem o outro problema...!
Quando usa @ não mostra os avisos.

Saudações,
Itamar M. Lins Jr.

bug Harbour ???

Enviado: 07 Mai 2020 16:50
por Itamar M. Lins Jr.
Ola!
Outra coisa, que me levou não entender no inicio.
No segundo exemplo a primeira linha depois da "function main" é que está correta: "LOCAL nOpcGeral := 1"
E aparece os "warnigs" nela e demais, fica a ultima linha como certa. Só que a ultima linha não atribui a "condição" de "LOCAL" para a variável.

Saudações,
Itamar M. Lins Jr.

bug Harbour ???

Enviado: 07 Mai 2020 19:43
por JoséQuintas
Itamar M. Lins Jr. escreveu:E aparece os "warnigs" nela e demais, fica a ultima linha como certa. Só que a ultima linha não atribui a "condição" de "LOCAL" para a variável.
sim, porque o aviso é sobre o :=1 sobre o valor atribuído que não serve pra nada, e não sobre o LOCAL.
Na última não dá esse erro, porque a última com certeza é a que fica valendo pro resto do fonte.

Colocar multiplicado foi justamente pra mostrar que o @ desativa todas as mensagens.

faz tempo que acontecia isso, e eu ficava sem entender porque não avisava no fonte do aplicativo, mas avisava em fonte separado.

Agora tá explicado: é o @

Vamos ver se tem solução, porque esse é daqueles casos onde só os masters conseguem mexer/analisar.