Portal SAMP
[Ajuda] Dois problemas com o pawn - 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] Dois problemas com o pawn (/showthread.php?tid=3091)



Dois problemas com o pawn - ilakt - 21/12/2022

I. Aparece "Unable to compile "VCRP.pwn" sempre que tento compilar a GM (na imagem anexada)

II. "error 033: array must be indexed (variable "pName")" Aparece quando compilo esse código, segue abaixo a linha do código:

Obs: A stock "pName" serve para ver o nome do jogador e a stock "IsAkt" serve para checar se o player tem o nick "ilakt" (que é o meu nick, uso isso para comandos importantes como o de deletar contas e fazer alterações no servidor)

Código:
stock pName(playerid)
{
    new Nome[100];
    GetPlayerName(playerid, Nome, 100);
    return Nome;
}


stock IsAkt(playerid)
{
    //linha do erro abaixo
    if(pName(playerid) == "ilakt")
    {
        return true;
    }
    else
    {
        return false;
    }
}



RE: Dois problemas com o pawn - Carlos Victor - 22/12/2022

Não é recomendável que utilize variáveis grandes de forma desnecessária, visto que o nome do jogador só cabe 24 caracteres, não tem por que criar uma
com 100 células. Também não é recomendável que utilize uma new numa função que será chamada constantemente muitas vezes por segundo, minutos, horas... Isto é, será criado a variável Nome toda vez a que a função pName for chamada.
E também não é legal retornar string por função, é recomendável que você crie um macro para isso e armazene o nome do jogador numa variável.


Código totalmente corrigido e melhorado:
Código:
new playerName[MAX_PLAYERS][MAX_PLAYER_NAME];
#define GetName(%0) playerName[%0]

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid, playerName[playerid], sizeof(playerName));
    return 1;
}

stock IsAkt(playerid)
{
    if(!strcmp(GetName(playerid), "ilakt", true)) {
        return true;
    }

    return false;
}

Qualquer dúvida, responda o tópico com os erros e print do código.

Esquecid de falar da função IsAkt bom, basicamente o erro era por que você setava comparando a string de forma errada.
Não se compara a string usando == (ao menos no pawn), você precisa usar a função strcmp para isso, a função retorna 0 se for true.


RE: Dois problemas com o pawn - White_Blue - 22/12/2022

(22/12/2022 02:09)Carlos Victor Escreveu: Não é recomendável que utilize variáveis grandes de forma desnecessária, visto que o nome do jogador só cabe 24 caracteres, não tem por que criar uma
com 100 células. Também não é recomendável que utilize uma new numa função que será chamada constantemente muitas vezes por segundo, minutos, horas... Isto é, será criado a variável Nome toda vez a que a função pName for chamada.
E também não é legal retornar string por função, é recomendável que você crie um macro para isso e armazene o nome do jogador numa variável.


Código totalmente corrigido e melhorado:
Código:
new playerName[MAX_PLAYERS][MAX_PLAYER_NAME];
#define GetName(%0) playerName[%0]

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid, playerName[playerid], sizeof(playerName));
    return 1;
}

stock IsAkt(playerid)
{
    if(!strcmp(GetName(playerid), "ilakt", true)) {
        return true;
    }

    return false;
}

Qualquer dúvida, responda o tópico com os erros e print do código.

Esquecid de falar da função IsAkt bom, basicamente o erro era por que você setava comparando a string de forma errada.
Não se compara a string usando == (ao menos no pawn), você precisa usar a função strcmp para isso, a função retorna 0 se for true.

Código PHP:
stock GetPlayerNameEx(playerid) {
     static 
Name[MAX_PLAYER_NAME]; // 24 Células do MAX_PLAYER_NAME.
     
GetPlayerName(playeridNameMAX_PLAYER_NAME);
     return 
Name;




RE: Dois problemas com o pawn - Carlos Victor - 23/12/2022

Citar:
Código PHP:
stock GetPlayerNameEx(playerid) {
     static Name[MAX_PLAYER_NAME]; // 24 Células do MAX_PLAYER_NAME.
     GetPlayerName(playeridNameMAX_PLAYER_NAME);
     return Name;


Essa forma é a tradicional portanto mesmo usando variáveis estáticas para evitar o consumo de memória do servidor, retornar string dessa maneira é ruim, por isso optei por recomendar o macro, que retorna o valor direto da variável. Que por sinal, é bem melhor e mais otimizado do que chamar numa função.


RE: Dois problemas com o pawn - strelo - 25/12/2022

The first error message you mentioned, "Unable to compile "VCRP.pwn"", suggests that there is a problem with the script file itself, or with the compiler being used to build the script. This could be due to a number of reasons, such as a syntax error in the script, a missing include file, or a problem with the compiler itself.

The second error message, "error 033: array must be indexed (variable "pName")", occurs when you try to access an element of an array without specifying an index. In this case, it appears that you are trying to call the "pName" function without passing it a playerid parameter. To fix this error, you will need to pass a playerid to the "pName" function when you call it, like this:

pName(playerid);