SA-MP Forums Archive
[Tutorial] #emit IDXADDR - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Português/Portuguese (https://sampforum.blast.hk/forumdisplay.php?fid=34)
+----- Forum: Lançamentos/Releases (https://sampforum.blast.hk/forumdisplay.php?fid=56)
+----- Thread: [Tutorial] #emit IDXADDR (/showthread.php?tid=466297)



#emit IDXADDR - ipsBruno - 27.09.2013

Vou comeзar a fazer uma listinha de tutoriais, com alguns truques que ando aprendendo em #emit. Pra quem nгo sabe o que й isto, favor, veja os seguintes links:


https://sampforum.blast.hk/showthread.php?tid=360155
https://sampforum.blast.hk/showthread.php?tid=315531


Como podem ver, ambos tutoriais estгo incompletos. Porque й simplesmente dнficil demais, ensinar #emit, tem muitos opcodes (que nem eu mesmo consegui aprender) e por este motivo й necessбrio que se faзam muitos tutoriais. Pois bem, antes de tudo. Vocкs devem saber o bбsico de #emit para pelo menos entender esse tutorial.


Nesse pequeno tutorial, vou explicar como й o uso do opcode IDXADDR. Que nгo foi bem explicado em alguns tutoriais. Vamos lб!



Basicamente, quando vocк carrega uma array para memуria em #emit

pawn Code:
#emit LOAD.S.alt array
Vocк nгo poderб manipular os valores internos dela, por isto existe o IDXADDR, que basicamente й a abreviatura de INDEX ADDRESS, pois vocк estб pegando o valor address INDEX de uma array atravйs do endereзo dela. Entenderam? Nгo?

Vou explicar melhor:

Quando vocк tem

PHP Code:
new array [] = {1,2,3,4,5}; 
Em #emit, й muito complicado pegar um ъnico valor desta array (seja 1,2,3,4 ou 5) por este motivo, usando IDXADDR vocк pode combinar o armazenamento ALT (alternativo) com o PRI (primбrio) e pegar algum desses valores de dentro da array, nesse caso, pegarб o endereзo deles, simplesmente fazendo


pawn Code:
new array[] = {1,2,3,4,5};
   
    new idx = 2; // irei pegar o endereзo do elemento 2 da array, no caso da parte 3
   
    new arrayvalue; // cйlula para armazenamento do valor
   
    // carregar array para o registro alternativo
    #emit LOAD.S.alt array
   
    // carregar o valor de idx para o registro primбrio
    #emit LOAD.S.pri idx
   
    // IDXADDR, neste caso iria armazenar no registro prнmario: array[iter]
    #emit IDXADDR
   
    // para demonstraзгo, salvarei o valor de array[idx] em arrayvalue
    #emit STOR.S.pri arrayvalue
   
    // mбgica! arrayvalue agora tem o valor address da array, que era array[idx] addr
    printf("%d", arrayvalue);

EXEMPLO:

Serve para pegar valores na array (уbvio), veja o exemplo:

pawn Code:
new array[] = {48481,184};

printf("%d", getidx(array, 1)); // 184

stock getidx(arr[], idx) {

    // carrega no registro primбrio o idx
    #emit LOAD.S.pri    idx
   
    // carrega a array no registro secundario
    #emit LOAD.S.alt    arr
   
    // pega o endereзo de arr[idx]
    #emit IDXADDR
   
    // armazena o valor do endereзo em idx
    #emit STOR.S.pri    idx
   
    // carrega a array
    #emit LOAD.I
   
    // armazena o valor de arr[idx] em idx agora
    #emit STOR.S.pri    idx
   
    // retorna o valor encontrado
    #emit RETN
   
    // faзa o compilador feliz
    return 0;
}
Viram? Й simples, mas pode-se usar para muitas coisas. Logo que eu puder, estarei fazendo outros tutoriais referente a outros opcodes nгo mostrados no tutorial do rjj.


Qualquer erro no tutorial avisem.


Abraзos


Re: #emit IDXADDR - Schocc - 27.09.2013

Muito bom nota 10

Seria нndice de endereзo?


Re: #emit IDXADDR - Caio_Freeze - 27.09.2013

Muito bom apesar de ser mto avanзado pra min '-'


Re: #emit IDXADDR - ipsBruno - 27.09.2013

Quote:
Originally Posted by Schocc
View Post
Muito bom nota 10

Seria нndice de endereзo?
Sim, com isto dб para pegar o valor do нndice da array, ou atй fazer trocas de valores, ou manipular toda a array por si. Й bem fбcil.


Re: #emit IDXADDR - zSuYaNw - 27.09.2013

Nгo conhecia este opcode. bom trabalho DraKoN.


Re: #emit IDXADDR - ipsBruno - 27.09.2013

Й ipsBruno

Adicionei um exemplo ao cуdigo. Abraзos


Re: #emit IDXADDR - zSuYaNw - 27.09.2013

й possнvel com strings?


Re: #emit IDXADDR - ipsBruno - 27.09.2013

Perfeitamente, sу que os valores manipulados serгo em decimais. Mas normal, sу imprimir com %c


pawn Code:
new string[] = "Suyanw boiola";
printf("%c", getidx(string, 5)); // retorna w



Re: #emit IDXADDR - Schocc - 27.09.2013

legal mesmo, o que me diz sobre anti-cheats feitos em #emit? maquina abstrata?, funcionaria?


Re: #emit IDXADDR - zSuYaNw - 27.09.2013

Quote:
Originally Posted by Schocc
View Post
legal mesmo, o que me diz sobre anti-cheats feitos em #emit? maquina abstrata?, funcionaria?
Creio que a diferenзa seria minima.


Re: #emit IDXADDR - ipsBruno - 27.09.2013

Quote:
Originally Posted by Schocc
View Post
legal mesmo, o que me diz sobre anti-cheats feitos em #emit? maquina abstrata?, funcionaria?
Nгo tem muito o que fazer com #emit. Na verdade nгo tem quase nada haver.

#emit apenas serve para manipular a memуria de forma bruta, nгo tem muita utilidade quando utilizado em jogo.


Re: #emit IDXADDR - RuanRider - 27.09.2013

tem sу %c e %d?
creio que nгo, me mostra outros ae?


Re: #emit IDXADDR - ipsBruno - 27.09.2013

que eu lembro, sгo estes. mas hб como fazer mais.

%s %b %x %i %c %% %f %d

mas pode manipula-los com

%20s ou %0.3f %02d etc.

se estiver em sscanf, hб outra gama tambйm

p<delim>, u, s,i,d,z,b,p,a,h,x,o,r,g,s[N],a<especificadores>[size],{opcional},(Ns),e<especificadores>


tambйm tem os carriers

\n \a \r \\ \xN \bN (n = numero no formato)


Re: #emit IDXADDR - RuanRider - 27.09.2013

qual o resultado dessas manipulaзхes? %20s, %0.3f ..

e qual o nome dado isso %letra?


Re: #emit IDXADDR - ipsBruno - 27.09.2013

%20s vai completar com espaзos o que falta

PHP Code:
printf("'%08s'""Bruno"); 
Bruno tem 5 caracteres, mas sгo 8. Entгo completa 3 com espaзos


%0.3f vai literalmente pegar sу atй X nъmeros apуs casas decimais

PHP Code:
printf("%0.3f"1.16819841); 
vai imprimir sу 1.16


%04d preenche com zeros um inteiro


algo como:

PHP Code:
printf("%04d"10); 
Sгo duas casas, mas eu pedi 4. Entao ele completa 2 com zeros a esquerda

0010




O nome %letra na programaзгo pode ser placeholder ou especificadores (specifiers). Depende qual objetivo da funзгo. Em sscanf, quando nгo se usa % se chama especificador, pois especifica o tipo de dado imposto. Em format %letra se chama placeholder, pois % й substituнdo pela variбvel indicada


EDITADO

Esqueci do carrier de tab tambйm \t


Re: #emit IDXADDR - zPain - 28.09.2013

Eu escrevi uma funзгo similar а sua getidx, mas fiquei com uma pequena dъvida:


Seu cуdigo:
pawn Code:
stock getidx(arr[], idx) {

    // carrega no registro primбrio o idx
    #emit LOAD.S.pri    idx
   
    // carrega a array no registro secundario
    #emit LOAD.S.alt    arr
   
    // pega o endereзo de arr[idx]
    #emit IDXADDR
   
    // armazena o valor do endereзo em idx
    #emit STOR.S.pri    idx
   
    // carrega a array
    #emit LOAD.I
   
    // armazena o valor de arr[idx] em idx agora
    #emit STOR.S.pri    idx
   
    // retorna o valor encontrado
    #emit RETN
   
    // faзa o compilador feliz
    return 0;
}

Meu cуdigo:
pawn Code:
stock GetArrayIndex(array[], index)
{
    #emit LOAD.S.PRI index
    #emit LOAD.S.ALT array

    #emit IDXADDR

    #emit STOR.S.PRI index
    #emit LOAD.I

    #emit RETN
    return 0;
}

Repare que eu nгo executo um novo STOR apуs o LOAD. Existe alguma razгo especнfica para que vocк faзa isso?


Re: #emit IDXADDR - ipsBruno - 29.09.2013

Erro meu. Nгo hб necessidade de STOR apуs o LOAD.I, й que quando fiz a funзгo ela retornava em IDX, entгo eu modifiquei o cуdigo para RETN e acabei deixando o STOR ali.


Abraзos