[Ajuda] O que essa funзгo faz?
#1

E aew galera
Eu entendo muito bбsico desse assunto, queria saber o que essa funзгo faz
Eu empaquei principalmente no FILL, o que isso faz?


PHP код:
stock fixmemset(aArray[], iValueiSize sizeof(aArray)) {
    new 
iAddress;
    
    
#emit LOAD.S.pri 12
    #emit STOR.S.pri iAddress
    
    
iSize *= 4;
    
    while (
iSize 0) {
        if (
iSize >= 4096) {
            
#emit LOAD.S.alt iAddress
            #emit LOAD.S.pri iValue
            #emit FILL 4096
        
            
iSize    -= 4096;
            
iAddress += 4096;
        } else if (
iSize >= 1024) {
            
#emit LOAD.S.alt iAddress
            #emit LOAD.S.pri iValue
            #emit FILL 1024
            
iSize    -= 1024;
            
iAddress += 1024;
        } else if (
iSize >= 256) {
            
#emit LOAD.S.alt iAddress
            #emit LOAD.S.pri iValue
            #emit FILL 256
            
iSize    -= 256;
            
iAddress += 256;
        } else if (
iSize >= 64) {
            
#emit LOAD.S.alt iAddress
            #emit LOAD.S.pri iValue
            #emit FILL 64
            
iSize    -= 64;
            
iAddress += 64;
        } else if (
iSize >= 16) {
            
#emit LOAD.S.alt iAddress
            #emit LOAD.S.pri iValue
            #emit FILL 16
            
iSize    -= 16;
            
iAddress += 16;
        } else {
            
#emit LOAD.S.alt iAddress
            #emit LOAD.S.pri iValue
            #emit FILL 4
            
iSize    -= 4;
            
iAddress += 4;
        }
    }
    
    
#pragma unused aArray

Reply
#2

ninguйm ??
Reply
#3

Nгo tinha visto este teu tуpico ainda, bacana a pergunta.

Eu dei uma breve olhada, me pareceu ser um patcher.

Ele vai receber um valor determinado e vai alterar DIRETAMENTE no endereзo da memуria, й como se vocк pudesse alterar o valor de uma variбvel de forma 'vulgar', por assim dizer, sem que ela saiba, entende?

O FILL tem a funзгo de preencher a memуria que tб no registrador alternativo com os valores do registrador primбrio.
Reply
#4

Hum...
agora entendi atй o motivo do while, mas ainda tem algumas coisas que nгo estгo claras...
O FILL vai preencher apenas o tamanho que tiver escrito apуs ele, certo?
Ou seja, FILL 4096 vai preencher apenas os primeiros 4096 bytes, a contar a partir do primeiro byte do registro alternativo, certo ?

Mas isso ainda me parece meio sem sentido...
o iValue й um valor do tamanho de uma das dimensхes do array, entгo pra que alguйm copiaria o valor do tamanho dessa dimensгo para uma variбvel que foi criada e que aparentemente nгo tem nenhuma aplicaзгo?
E ainda, pra que essas 2 primeiras linhas?
PHP код:
    #emit LOAD.S.pri 12
    #emit STOR.S.pri iAddress 
Nгo sei se ajuda, mas olha o exemplo de uma aplicaзгo
PHP код:
enum pPaperInfo 

    
PaperdbID
    
PaperUsed
    
PaperMaker[25], 
    
PaperTitle[64], 
    
SafeSaving
}; 
new 
PaperInfo[MAX_LOADED_PAPERS][pPaperInfo];
 
stock ClearPaper(paper

    new  
        
string[] = "None"
        
0
     
    
fixmemset(PaperInfo[paper], 0pPaperInfo); 
    
memcpy(PaperInfo[paper][pPaperInfo:0], string_:PaperMaker 42020); 
    
memcpy(PaperInfo[paper][pPaperInfo:0], string_:PaperTitle 42020); 
     
    for(; 
!= MAX_LOADED_PAPERTEXTS; ++i) { 
        
fixmemset(PaperText[paper][0], 0MAX_PAPERTEXT_LENGTH); 
        
memcpy(PaperText[paper][0], string020MAX_PAPERTEXT_LENGTH); 
    } 
     
    
SavePapers(); 
    return 
1

Reply
#5

Quote:
Originally Posted by dudaefj
Посмотреть сообщение
pra que essas 2 primeiras linhas?
PHP код:
    #emit LOAD.S.pri 12
    #emit STOR.S.pri iAddress 
Creio que isso seja frescura do pawn, ele precisa de um valor inicial pra poder encontrar o addr da variбvel.
Tem uma contagem pra isso, nгo lembro como funciona exatamente, mas jб li sobre isso.

Quote:
Originally Posted by dudaefj
Посмотреть сообщение
O FILL vai preencher apenas o tamanho que tiver escrito apуs ele, certo?
Ou seja, FILL 4096 vai preencher apenas os primeiros 4096 bytes, a contar a partir do primeiro byte do registro alternativo, certo ?
Sim, й isso mesmo se eu tiver entendido bem.

Quote:
Originally Posted by dudaefj
Посмотреть сообщение
Mas isso ainda me parece meio sem sentido...
o iValue й um valor do tamanho de uma das dimensхes do array, entгo pra que alguйm copiaria o valor do tamanho dessa dimensгo para uma variбvel que foi criada e que aparentemente nгo tem nenhuma aplicaзгo?
a iValue pelo que me pareceu й o valor que tu vai usar pra preencher os endereзos do registrador ALT

й como se tu fosse alterar a variбvel matriz x para todos valores 10.

10 = iValue
x = iAddress

e o FILL vai rodando em rodos indexes preenchendo o valor antigo com o iValue.

OBS: Lembrando que eu nгo manjo muito do emit pela questгo da arquitetura do Pawn, entгo oque eu estou te falando estб correto, mas superficial, tem detalhes mais importantes que precisam ser visados para que a sua funзгo nгo gere bugs OU sйrios problemas com a memуria na hora da manipulaзгo.
Reply
#6

1 cell = 4 bytes, essa й a contagem.


Sobre a variбvel "iAddress" й utilizada para saber o endereзo atual;
Dentro do loop, й usada a reversгo de valores(iSize * 4, tamanho da array em bytes);
E iAddress, que й para saber em que endereзo deve ser preenchido;
O #emit fill, o registro alt й a memуria e o pri й o valor a ser preenchido.


Agora sobre estб parte abaixo, a explicaзгo й simples, й porque as variбveis de argumentos ficam acima do endereзo atual(acima das locais, que estгo dentro da funзгo.)

PHP код:
#emit LOAD.S.pri 12 
#emit STOR.S.pri iAddress 
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)