Portal SAMP
[Ajuda] Passar função por parametro - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Passar função por parametro (/showthread.php?tid=1244)



Passar função por parametro - robertjwx - 31/05/2021

Existe alguma forma no pawn de passar uma função por parametro?





Eu estou com um problema de performace nessa função:
Código:
public AtualizarRoubos() {
    // atualizar roubos
    for(new bizzid = 1; bizzid < MAX_BIZZ; bizzid++) {
        BizzInfo[bizzid][rexaustedrobbery] -= 5;
        if(BizzInfo[bizzid][rexaustedrobbery] < 0) BizzInfo[bizzid][rexaustedrobbery] = 0;
    }
}


Isso porque o meu #define MAX_BIZZ é 5000

Então o loop é muito grande...



Pra resolver isso seria bom se desse pra passar uma função dentro de outra, tipo:

Código:
forward LoopAllBizz(func);
forward ActionLoopRangeBizz(func, idStart, idEnd);
forward PrintBizzName(bizzid);

public LoopAllBizz(func) {
    SetTimerEx("ActionLoopRangeBizz", 10, false, "iii", func, 1, 1000);
    SetTimerEx("ActionLoopRangeBizz", 20, false, "iii", func, 1001, 2000);
    SetTimerEx("ActionLoopRangeBizz", 30, false, "iii", func, 2001, 3000);
    SetTimerEx("ActionLoopRangeBizz", 40, false, "iii", func, 3001, 4000);
    SetTimerEx("ActionLoopRangeBizz", 50, false, "iii", func, 4001, 5000);
}
public ActionLoopRangeBizz(func, idStart, idEnd) {
    for(new bizzid = idStart; bizzid <= idEnd; bizzid++) {
        func();
    }
}
function PrintBizzName(bizzid) {
  print("[%i]: %s", bizzid, BizzInfo[bizzid][bizzName] )
}


CMD:test(playerid) {
    LoopAllBizz(PrintBizzName(bizzid));
    return true;
}


Mas parece que não da...

Ou da?



E agora, o que eu faço?


RE: Passar função por parametro - xbruno1000x - 31/05/2021

Por que você precisa de 5000 negócios? Não há possibilidade de diminuir?


RE: Passar função por parametro - ProKillerPa - 31/05/2021

Boa noite. Não entendi muito bem o que voce quis tentar demonstrar nesse seus código com o settimerex, porém faço da minha resposta a do bruno, diminuia o total de empresas. No seu caso o loop é o melhor jeito.

Abraços


RE: Passar função por parametro - xbruno1000x - 31/05/2021

(31/05/2021 18:20)ProKillerPa Escreveu: Boa noite. Não entendi muito bem o que voce quis tentar demonstrar nesse seus código com o settimerex, porém faço da minha resposta a do bruno, diminuia o total de empresas. No seu caso o loop é o melhor jeito.

Abraços

Ele tentou dividir um looping de 5000 em 5 loopings de 1000. Mas ainda assim eu acho muitos negócios... se levarmos em consideração que um servidor samp pode comportar no máximo 1000 players, cada um player poderia ter 5 negócios.


RE: Passar função por parametro - ProKillerPa - 31/05/2021

Sim, com certeza, 5000 negocios é absurdo.. Mas enfim, faça o loop como voce já estava fazendo, no seu caso não há uma solução melhor.

Abraços


RE: Passar função por parametro - ipsLuan - 31/05/2021

Você quer atualizar o roubo de uma propriedade específica?
Se sim, você pode fazer dessa maneira:

Código PHP:
public AtualizarRoubos(prop) {
    
BizzInfo[prop][rexaustedrobbery] -= 5;
    if(
BizzInfo[prop][rexaustedrobbery] < 0BizzInfo[prop][rexaustedrobbery] = 0;


Sendo a variável 'prop' o ID da propriedade que está sendo roubado.


RE: Passar função por parametro - Luiz - 01/06/2021

Recomendo que use foreach e Iterator.
Código PHP:
new Iterator:Empresas<MAX_EMPRESAS>; 
No carregamento das empresas:
Código PHP:
Iter_Add(Empresasi); // Substitua i pelo ID da empresa 
Na função do loop
Código PHP:
foreach(new iEmpresas)
{
    ...

Dessa forma vai fazer um loop somente pelas quais são criadas. Se o MAX_EMPRESAS é definido como 5000 e existem somente 20 empresas criadas no servidor, invés de fazer um loop de 5000, vai fazer apenas por 20, ignorando as inválidas.


RE: Passar função por parametro - robertjwx - 01/06/2021

(01/06/2021 08:42)Luiz Escreveu: Recomendo que use foreach e Iterator.
Código PHP:
new Iterator:Empresas<MAX_EMPRESAS>; 
No carregamento das empresas:
Código PHP:
Iter_Add(Empresasi); // Substitua i pelo ID da empresa 
Na função do loop
Código PHP:
foreach(new iEmpresas)
{
    ...

Dessa forma vai fazer um loop somente pelas quais são criadas. Se o MAX_EMPRESAS é definido como 5000 e existem somente 20 empresas criadas no servidor, invés de fazer um loop de 5000, vai fazer apenas por 20, ignorando as inválidas.

É uma boa ideia, mas no meu caso não serve, pq essas 5000 já estão setadas e eu pretendo setar ainda mais...

Precisava de alguma forma optimizar esse loop...

Pra cada entrada de loja no mapa do GTA tem uma empresa setada por causa da proposta do meu servidor...
Eu ainda vou setar LS e SF eu só setei LV...

---

E respondendo aos outros comentários, não.. A solução não pode ser uma defeature
Esse sistema de empresa faz parte da proposta do servidor

Se fosse em outra linguagem teria como passar a função por parametro e dividir o loop, mas o pawn não colabora...
Alguém tem alguma ideia de como optimizar isso?


RE: Passar função por parametro - xbruno1000x - 01/06/2021

(01/06/2021 15:17)robertjwx Escreveu: É uma boa ideia, mas no meu caso não serve, pq essas 5000 já estão setadas e eu pretendo setar ainda mais...

Precisava de alguma forma optimizar esse loop...

Pra cada entrada de loja no mapa do GTA tem uma empresa setada por causa da proposta do meu servidor...
Eu ainda vou setar LS e SF eu só setei LV...

---

E respondendo aos outros comentários, não.. A solução não pode ser uma defeature
Esse sistema de empresa faz parte da proposta do servidor

Se fosse em outra linguagem teria como passar a função por parametro e dividir o loop, mas o pawn não colabora...
Alguém tem alguma ideia de como optimizar isso?

Já trabalhei em um GM que dividia as empresas por tipos e isso talvez te ajude. Ele funcionava basicamente duplicando os sistema base de empresas. Então havia os Bizz[ID][Var], Fazenda[ID][Var], etc. Talvez dividindo o sistema por algum critério criativo você consegue diluir o tamanho de 1 looping em vários.

Minha visão sobre sua ideia:
O SA-MP foi criado para rodar em máquinas 32 bits, e como todos sabem, 32 bits limita muito a capacidade de processamento da máquina. Para otimizar esse sistema terá que pensar em soluções criativas que ainda não foram pensadas no SA-MP. (E que podem nunca existir...)
Boa sorte com isso.