Declarar atribuindo valor

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Declarar atribuindo valor

Mensagem por JoséQuintas »

Tava aqui mexendo com fonte de terceiros e peguei isso.

Código: Selecionar todos

LOCAL A := B := C := D := 0
Isso declara apenas A como LOCAL.
Os demais já são operação de atribuição, e serão variáveis PRIVATE.
d:\temp>copy con x.prg
PROCEDURE Main

LOCAL A := B := C := D := E := 0

RETURN
^Z
1 arquivo(s) copiado(s).

d:\temp>hbmk2 x -w3 -es2


hbmk2: Processing environment options: -comp=mingw
hbmk2: Processing configuration: d:\harbour\bin\hbmk.hbc
Harbour 3.2.0dev (r2503251254)
Copyright (c) 1999-2024, https://harbour.github.io/
Compiling 'x.prg'...

x.prg:3: warning W0001 Ambiguous reference 'E'

x.prg:3: warning W0001 Ambiguous reference 'D'

x.prg:3: warning W0001 Ambiguous reference 'C'

x.prg:3: warning W0001 Ambiguous reference 'B'

x.prg:6: warning W0032 Variable 'A' is assigned but not used in function '3:MAIN'

No code generated.
O erro compilando com -w3 -es2 é justamente alertando sobre a falta de declaração das outras variáveis

Já o último aviso é normal... declarei a variável A e não usei pra nada, está inútil no fonte, a mensagem é sobre atribuir zero e não usar pra nada.
Mas retirando o 0, vai continuar inútil, declarada e não usada e vai mudar a mensagem de erro.
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/
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

Declarar atribuindo valor

Mensagem por ivanil »

Pois é,
Embora não tenha o costume de fazer declarações dessa forma, sempre tive a convicção de que as variáveis eram locais; isso pode até explicar alguns bugs que enfrentei sem entender a causa;

Código: Selecionar todos

memvar a,b,c,d,e

Function Main( )
    Local a:=b:=c:=d:=e:=0
    test2()
    ?a,b,c,d,e //=> 0 2 3 4 5
    wait
    REturn .T.
    
function test2()
    a:=1
    b:=2
    c:=3
    d:=4
    e:=5
    return Nil

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Declarar atribuindo valor

Mensagem por JoséQuintas »

Seria o equivalente a:

Código: Selecionar todos

LOCAL a := (  b :=   (  c := ( d := ( e := 0 ) ) ) )
Dessa forma fica visível que não houve declaração de b,c,d,e
Pois é, não parece, mas seguir regras, e às vezes formatar fonte, ajudam muito.
E compilar -w3 -es2 também ajuda muito, muita coisa pode passar sem perceber.
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Declarar atribuindo valor

Mensagem por alxsts »

Olá!

Eu aprendi isso há algumas décadas, ainda no Clipper. Não me lembro se li em algum lugar ou foi troca de conhecimento com algum colega.

Foi bom levantar a questão, pois é algo pouco documentado.
[]´s
Alexandre Santos (AlxSts)
Responder