Página 1 de 1

Cuidado ao declarar variáveis com M->

Enviado: 30 Mar 2021 15:29
por JoséQuintas

Código: Selecionar todos

MEMVAR a

PROCEDURE Main

   PRIVATE a := 20

   Teste()

   Inkey(0)

FUNCTION Teste()

   LOCAL a := 10

   ? m->a
   ? a

   RETURN Nil
Resultado na tela:

20
10

Usar variável com m-> não é a mesma coisa que declarar variável.
m-> é pra variáveis PRIVATE.

Interessante isso....

Cuidado ao declarar variáveis com M->

Enviado: 30 Mar 2021 21:39
por asimoes
Na documentação diz:


MEMVAR
Declares PRIVATE or PUBLIC variables.

Cuidado ao declarar variáveis com M->

Enviado: 31 Mar 2021 08:06
por JoséQuintas
Sim MEMVAR é pra declarar variáveis PUBLIC e PRIVATE.

E m->variavel é justamente pra pegar valor de PUBLIC/PRIVATE.
Sempre pensei que m-> indicava qualquer tipo de variável, mas é só pra PUBLIC/PRIVATE.

Na compilação -w3 -es2 isso fica bem claro, porque m-> acaba sendo similar a declarar como memvar.

No caso de rotinas de LIB, por exemplo, colocar m-> em tudo que é variável pode ter resultados imprevisíveis.

Aqui uso alias pra aquivos, e somente pra arquivos. arquivo->campo
Variáveis deixo sem nenhuma indicação, sempre declarando LOCAL ou MEMVAR pras exceções.
E declaração FIELDS não uso. A única exceção é na indexação: index on field->campo TAG tatu
Na indexação funciona usar arquivo->campo, mas isso deixa preso ao ALIAS, e nunca se sabe se poderemos usar alias diferente.

Cuidado ao declarar variáveis com M->

Enviado: 31 Mar 2021 08:12
por JoséQuintas
Aqui mais claro:

Código: Selecionar todos

FUNCTION Main()

   LOCAL a

   a := 10
   m->a := 20
   ? a
   ? m->a

   inkey(0)
Retorna 10, 20

Cuidado ao declarar variáveis com M->

Enviado: 31 Mar 2021 08:15
por JoséQuintas

Código: Selecionar todos

FUNCTION Main()

   LOCAL a

   a := 10
   ? a
   ? m->a

   inkey(0)

   RETURN Nil
E aqui.... dá erro de variável não existe no m->a

definitivamente m->variavel indica explicitamente variável diferente de LOCAL.