ERRO MACRO STRING E0042

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

roberval
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 08 Out 2019 10:48
Localização: maringa/pr

ERRO MACRO STRING E0042

Mensagem por roberval »

Olá pessoal
estou migrando do xharbour comercial pra harbour
na compilação tem dado erro Error E0042 Macro of declared symbol '&I - Obs.Cadastro'
sendo que não tem nada com macro.. é uma string..
se eu mudo o conteudo pra qquer coisa diferente do I.. funciona..
compilando hbmk2
Harbour 3.2.0dev (r2312082217)

agradecido qquer ajuda
abraço
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

ERRO MACRO STRING E0042

Mensagem por alxsts »

Olá!

A segurança de algumas operações no Harbour foi reforçada em relação ao xHarbour. Isto faz com que alguns códigos que funcionam no xHarbour não funcionem da mesma forma no Harbour. Sugiro que leia o arquivo C:\hb320\doc\xhb-diff.txt, onde C:\hb320 é o local onde está instalado o Harbour em minha máquina.
roberval escreveu:na compilação tem dado erro Error E0042 Macro of declared symbol '&I - Obs.Cadastro'
Sem ver o código, fica difícil ajudar. O que está fazendo? Como está fazendo? Poste o código que está falhando.

O tópico Função STATIC em VALID trata de um caso semelhante. Talvez te ajude.
[]´s
Alexandre Santos (AlxSts)
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

ERRO MACRO STRING E0042

Mensagem por marco.prodata »

roberval escreveu:Olá pessoal
estou migrando do xharbour comercial pra harbour
na compilação tem dado erro Error E0042 Macro of declared symbol '&I - Obs.Cadastro'
sendo que não tem nada com macro.. é uma string..
se eu mudo o conteudo pra qquer coisa diferente do I.. funciona..
compilando hbmk2
Harbour 3.2.0dev (r2312082217)

agradecido qquer ajuda
abraço
Eu converti recentemente um sistema para harbour e tive vários pequenos problemas desse, um exemplo, quando se tenta chamar macro de um array, ai precisa isolar com ().
Ex:
de
do &vet[1]
para
&(vet[1])()

algumas coisas desse tipo, posta a linha do código que está dando erro, que fica mais fácil ajudar.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ERRO MACRO STRING E0042

Mensagem por JoséQuintas »

Talvez alterar a string pra "&" + "I....."
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/
roberval
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 08 Out 2019 10:48
Localização: maringa/pr

ERRO MACRO STRING E0042

Mensagem por roberval »

eu gostaria de entender o motivo..
se alterar a string pra "&" + "I....." realmente funciona..
mas porque tratar uma string como macro ? na compilação ? é uma string... segurança ?
roberval
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 08 Out 2019 10:48
Localização: maringa/pr

ERRO MACRO STRING E0042

Mensagem por roberval »

ele dá erro na linha 3 ("&N.f brica") /server/sist/_hb/sag/erelcinv.prg(160) Error E0042 Macro of declared symbol '&N.f brica'
porque não nas outras ?

VRADIO_ORD2[1] := HbRadioButton():new(L1+06,C1+02,"&C¢digo" ,"C¢digo")
VRADIO_ORD2[2] := HbRadioButton():new(L1+07,C1+02,"&Descri‡„o" ,"Descri‡„o")

VRADIO_ORD2[3] := HbRadioButton():new(L1+08,C1+02,"&N.f brica" ,"N.f brica")

VRADIO_ORD2[4] := HbRadioButton():new(L1+09,C1+02,"&Original" ,"Original")
VRADIO_ORD2[5] := HbRadioButton():new(L1+06,C1+16,"&Localiza‡„o" ,"Localiza‡„o")
VRADIO_ORD2[6] := HbRadioButton():new(L1+07,C1+16,"&Referˆncia" ,"Referˆncia")
AEval(VRADIO_ORD2,{|O| O:colorSpec:=VGRCOLOR2 })
marco.prodata
Usuário Nível 3
Usuário Nível 3
Mensagens: 238
Registrado em: 30 Nov 2018 10:07
Localização: Caratinga

ERRO MACRO STRING E0042

Mensagem por marco.prodata »

Olha o que consta no manual de diferenças do harbour pro xharbour, que o colega alxsts indicou, explica a situação

Código: Selecionar todos

###    MACROS WITH DECLARED SYMBOLS    ###
==========================================
In Clipper all constant strings in PRG code with "&" character inside
are preprocessed at runtime by macro compiler. It checks if characters
after "&" are valid variable name (starts with "_" or letter and then
mix of "_", letters and digits until first different character) and if
yes and such private or public variable exists and it contains string
then the original string is modified and &<varname>[.] is substituted
by variable contents, i.e.
   private var := "ABC"
   ? "[&var-rest][&var.rest]" // prints: [ABC-rest][ABCrest]
Please note that "." at the end of variable name has special meaning.
It can be used to mark end of macro variable name and is eaten during
substitution. This feature works only for memvars (private and public)
variables. If Clipper detects that variable declared as local, static
or field is used in such context then it generates compile time error
O harbour reproduz uma funcionalidade do clipper que ninguém usava, que ao processar uma string com &dentro, ele checa o conteúdo após pra ver se é uma variavel valida, se for ele pega o conteudo da variável, e explica que quanto tem um '.' na string, ele considera que o texto até o '.', vai checar se é uma variavel valida, como no seu texto tem apenas o N, é provavel que tenha alguma variável ou constante que está causando o erro.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ERRO MACRO STRING E0042

Mensagem por JoséQuintas »

Código: Selecionar todos

I := "XXXXX"
cTxt := &I alguma coisa"
Pela mensagem que mostrou, existe uma variável chamada I, e tentaria fazer &I
Já "&" + "I" descarta a possibilidade de tentar macro.

O harbour tem/tinha uma certa exigência nisso, talvez pra evitar esse tipo de coisa, porque como o programa vai saber se é ou não pra fazer macro encima disso.

É o tal negócio... às vezes o fonte aceita de tudo, e nem sempre é a forma correta de fazer.
Na hora de trocar de compilador, pode ser que continue aceitando ou não.
Há várias coisas desse tipo.

Igual aceitar função com espaço antes dos parêntesis... Dobro ( x )
Acho isso totalmente errado.
SELECT ( x ) é mudar de área
Select(x) é retornar a área atual
O que será que o compilador vai fazer nesse caso, já que aceita espaço ? o resultado com certeza não é o mesmo

Numa época o harbour exigia variável no mínimo PRIVATE pra fazer macro, não podia ser LOCAL.
Talvez o alerta seja uma ajuda pra resolver - o usuário decide e não o compilador.
Mas na prática o harbour tem uma área especial pra execução de macros, e variáveis locais não estariam visíveis lá, ou, se estivessem, seria um risco à segurança geral de execução.
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/
roberval
Usuário Nível 1
Usuário Nível 1
Mensagens: 19
Registrado em: 08 Out 2019 10:48
Localização: maringa/pr

ERRO MACRO STRING E0042

Mensagem por roberval »

"Pela mensagem que mostrou, existe uma variável chamada I, e tentaria fazer &I"

Exatamente isso, procurei no prg todo, tinha um for I .... sem declarar essa variavel I (ao meu ver, excesso de zelo na execução) mas tá ótimo.. descobriu..

valeu
Responder