[Ajuda] Mъltiplos Macros
#1

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);
}
Reply
#2

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
Reply
#3

Quote:

li alguns tutoriais do ******

Eu ja li tudo isso, mesmo assim nгo consegui compreender muito bem.
Reply
#4

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.
Reply
#5

Conhecimento й sempre bom nй, mesmo assim obrigado, aguardando alguйm que possa me dar uma breve explicaзгo.
Reply
#6

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...
Reply
#7

(@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"barfoobarfizzbar);

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"barfoobarfizzbar);

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:
PHP код:
// Exemplo da wiki https://sampwiki.blast.hk/wiki/Scripting...4.48267208
new
    
Strong:myStrong// Strong tag
    
weak:myWeak// weak tag
    
myNone// sem tag
 
myNone myStrong// Vai dar warning
myNone myWeak// NГO vai dar warning 
Dito isto, o cуdigo compila e roda de boa porque "m@1" e "m@1:m@2" sгo tags fracas.
Reply
#8

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
Reply
#9

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)
Reply
#10

Obrigado a ambos, nгo entendi completamente, mas vou ler mais vezes e tentar por em pratica.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)