Mъltiplos Macros -
Injury - 15.12.2017
Olб, alguйm que tenha conhecimento sobre macros avanзados poderia me dar uma explicaзгo do exemplo abaixo, li alguns tutoriais do ****** e outros membros mas nгo consegui entender como funciona, obrigado.
Exemplo do membro Misiur neste tуpico: https://sampforum.blast.hk/showthread.php?tid=638145
Код HTML:
#define MACRO1 m@1:m@2:m@3:@MACRO1
#define m@3:@MACRO1$%0$ (%0 + %0)
#define m@2:m@3:@MACRO1<%0> %0
#define m@1:m@2:m@3:@MACRO1<%0>[%1] %0[%1]
main() {
new Foo[32] = { -5, ... };
new bar = MACRO1<Foo>[1];
new Float:foobar = Float:MACRO1<5>;
new fizzbar = MACRO1$15$;
printf("%d %f %d", bar, foobar, fizzbar);
}
Re: Mъltiplos Macros -
Marllun - 15.12.2017
esse tutorial й bom para comeзar saber as coisas bбsicas
https://sampforum.blast.hk/showthread.php?tid=409296
https://sampforum.blast.hk/showthread.php?tid=348826
mas vocк quer o avanзado
Ler do 1 atй o 7 '='
https://sampforum.blast.hk/showthread.php?tid=570933
Eu nгo sei como explicar nгo uso muito macro
****** usou macro igual o do Misiur nesse post e dar para entender certinho
https://sampforum.blast.hk/showthread.php?pid=3801730#pid3801730
Re: Mъltiplos Macros -
Injury - 15.12.2017
Quote:
li alguns tutoriais do ******
|
Eu ja li tudo isso, mesmo assim nгo consegui compreender muito bem.
Re: Mъltiplos Macros -
Marllun - 15.12.2017
Por quer vocк quer saber?
Desculpe mais eu nгo posso ter ajudar. tem que esperar o zSuYaNw,IlanZ e PT entrar para ter ajudar.
Re: Mъltiplos Macros -
Injury - 15.12.2017
Conhecimento й sempre bom nй, mesmo assim obrigado, aguardando alguйm que possa me dar uma breve explicaзгo.
Re: Mъltiplos Macros -
Dayvison_ - 15.12.2017
Bom vamos lб xD.
Primeiramente vocк precisa entender como pawn reconhece e substitui os macros, o compilador ira detectar quaisquer ocorrкncias de acordo com a seguintes condiзхes:
- Nгo estar entre aspas
- Nгo estar entre A-Z a-z @ _
- Nгo estar antes de um numero
Agora vou dar um pequeno exemplo
Quote:
- Definiзгo
PHP код:
#define teste hello world!
- Serгo substituнdos por "hello world!"(Apenas a palavra teste)
PHP код:
teste
teste:
teste-
teste+
teste$
teste!
teste"
1teste
testeІ
- Nгo irб substituir
PHP код:
_teste
teste_
@teste
"teste"
teste1
|
Tendo isto em mente, vou explicar a detecзгo linha por linha, jб que no que irб substituir й irrelevante neste caso que й um exemplo apenas.
Quote:
- #define MACRO1 m@1:m@2:m@3:@MACRO1
Irб *dividir MACRO1 nos seguintes **sub-macros: m@1:, m@2: e m@3:
- #define m@3:@MACRO1$%0$ (%0 + %0)
Irб agora definir o que o **sub-macro m@3: farб, ele irб detectar uma expressгo como MACRO1$teste$
- #define m@2:m@3:@MACRO1<%0> %0
Irб agora definir o que o **sub-macro m@2: farб, ele irб detectar uma expressгo como MACRO1<teste>, jб que nгo foi detectado nenhum **sub-macro m@3 nesta expressгo.
- #define m@1:m@2:m@3:@MACRO1<%0>[%1] %0[%1]
Irб agora definir o que o **sub-macro m@1: farб, ele irб detectar uma expressгo como MACRO1<teste>[teste], jб que nгo foi detectado nenhum dos **sub-macros m@2 ou m@3 nesta expressгo.
- * Optei pelo termo dividir, mas na verdade ele apenas define novos macros m@1:, m@2: e m@3: nгo tem nenhum vinculo com MACRO1 para o compilador.
- ** Optei por este termo apenas para facilitar a explicaзгo, m@1:, m@2: e m@3: sгo macros totalmente independentes
|
Aqui deixo dois exemplos de macros postados por mim, para vocк tentar decifrar xD
https://gist.github.com/Dayvison/d89...br-inc-L26-L44
http://forum.sa-mp.com/showpost.php?...postcount=3238
@Off
PHP код:
#define u@$ 0]);
#define __:%0$ u@(u[_:%0 u@$
Tinha visto este cуdigo algum tempo atrбs, cara... isto.. й lindo...
Re: Mъltiplos Macros -
renatog - 15.12.2017
(@Dayvison_ postou uma excelente explicaзгo enquanto eu estava digitando esta, mas pra nгo jogar meus minutinhos no lixo eu vou postar mesmo assim)
O primeiro passo й saber pra que isso funciona. Vocк jб deve saber, mas vou explicar caso alguйm se interesse no assunto e nгo fique boiando totalmente.
O cуdigo que vamos explorar serve pra redefinir um macro de acordo com a estrutura utilizada, й como fazer "function overload", sу que com macros.
O segundo passo й entender a estrutura de busca dos macros pra entender o que estб acontecendo. Sгo definidas da seguinte forma:
PHP код:
#define <parte 1><parte 2><parte 3>
- parte 1: O nome do macro, deve iniciar com um caractere vбlido.
- parte 3: O caractere final (vбlido ou invбlido).
- parte 2: Tudo entre a parte 1 e a parte 3. Deve iniciar com um caractere invбlido para separar-se do nome do macro. Aqui й onde vocк coloca os parвmetros e tal.
Entгo vamos analisar os macros:
PHP код:
#define m@3:@MACRO1$%0$
parte 1: m@3
parte 2: :@MACRO1$%0
parte 3: $
PHP код:
#define m@2:m@3:@MACRO1<%0>
parte 1: m@2
parte 2: :m@3:@MACRO1<%0
parte 3: >
PHP код:
#define m@1:m@2:m@3:@MACRO1<%0>[%1]
parte 1: m@1
parte 2: :m@2:m@3:@MACRO1<%0>[%1
parte 3: ]
PHP код:
#define MACRO1 m@1:m@2:m@3:@MACRO1
parte 1: MACRO1
parte 2:
parte 3:
Este ъltimo й a cereja do bolo, ele combina todos os outros macros e serб justamente o macro que chamaremos nas funзхes.
Mas por que os macros m@2 e m@1 "incluem" os outros? Cada macro tem que rodar em certa situaзгo (vocк verб abaixo), entгo precisamos ter certeza que nгo ocorra de dois ou mais executarem ao mesmo tempo. Й pra isso que serve "m@1:m@2:m@3" e "m@2:m@3".
Note que hб uma ordenaзгo "m@1:m@2:m@3", "m@2:m@3". Isso significa que o m@2 sу vai executar se m@3 nгo executar e que m@1 sу vai executar se m@2 e m@3 nгo executarem.
(Note que, por executar, eu digo serem "encontrados" pelo prй compilador)
O que falta agora й entender o que cada macro detecta, mas o @Dayvison_ jб explicou bem isso, entгo vou pular direto pro resultado do cуdigo.
Esse cуdigo:
PHP код:
main() {
new Foo[32] = { -5, ... };
new bar = MACRO1<Foo>[1];
new Float:foobar = Float:MACRO1<5>;
new fizzbar = MACRO1$15$;
printf("%d %f %d", bar, foobar, fizzbar);
}
Vai ser compilado para isso:
PHP код:
main() {
new Foo[32] = { -5, ... };
new bar = Foo[1];
new Float:foobar = Float:m@1:5;
new fizzbar = m@1:m@2:(15 + 15);
printf("%d %f %d", bar, foobar, fizzbar);
}
Vocк deve estar se pergutando por que "Float:m@1:5" e "m@1:m@2: (15+15)" sгo cуdigos vбlidos. Apresento-lhe as "weak tags" em PAWN.
Hб dois tipos de tags em PAWN, as "strongs" (fortes) e "weaks" (fracas). Strong tags sгo inicadas com letra maiъscula (e.g.: File:, Float: ) e weak tags sгo iniciadas com letra minъscula (e.g.: bool: ).
A diferenзa entre elas й que strong tags dгo warning no compilador se vocк passar um valor sem tag a elas, enquanto as weak tags aceitam esses valores em tag. Exemplo:
Dito isto, o cуdigo compila e roda de boa porque "m@1" e "m@1:m@2" sгo tags fracas.
Re: Mъltiplos Macros -
Injury - 15.12.2017
Acho que estou comeзando a entender a lуgica, apenas uma coisa, para que server esse "@@@DURATION_END" no caso?
@edit renatog vou ler seu post agr, nгo tinha visto.
Код HTML:
#define DURATION_MS(%1) (DURATION(%1) * 1000)
#define DURATION(%1) (DURATION_PT:%1,0)@@@DURATION_END
#define DURATION_PT:%1,%0)@@@DURATION_END (%1:DURATION)+_:DURATION_PT:%0)@@@DURATION_END
#define @@@DURATION_END
Re: Mъltiplos Macros -
Dayvison_ - 15.12.2017
DURATION_PT й recursivo, ele se chama atй nгo ser mais reconhecido, e caso haja parвmetros extras na frente de DURATION(), ele iria "engoli-los", por isto uso o @@@DURATION_END(@@@ й apenas nomenclatura)
Re: Mъltiplos Macros -
Injury - 16.12.2017
Obrigado a ambos, nгo entendi completamente, mas vou ler mais vezes e tentar por em pratica.