[Tutorial] Resolver seus problemas fazendo "debug"
#1

Como fazer "debug":

• O que й debug? Como se faz isso?

Wikipedia: Depuraзгo (em inglкs: debugging, debug) й o processo de encontrar e reduzir defeitos num aplicativo de software ou mesmo em hardware. Erros de software incluem aqueles que previnem o programa de ser executado e aqueles que produzem um resultado inesperado.


Quando estamos programando, й comum que por nгo ter conhecimento suficiente ou estarmos cansados, nуs cometamos falhas que depois de compilado o cуdigo ou mesmo sem o ter compilado, nуs fiquemos perdidos, sem saber de onde vem o problema.
Й nessa hora que devemos fazer "debug", no meu ver, essa palavra й uma espйcie de gнria e significa o conjunto de aзхes que se faz pra obter tudo o que acontece no cуdigo. Fazendo isso podemos ter noзгo exata do que estб ocorrendo.

• Exemplo de depuraзгo

Bolei essa situaзгo pra que consigamos descobrir onde estб o erro, uma situaзгo simples e feita de um modo nгo otimizado, pra que todos possam entender.

Um comando que sу funciona pra o jogador de id 0(coisa comum de acontecer).

A ideia do comando й fazer com que o jogador morra apуs um tempo depois de ter o digitado e verificar se ele se moveu, caso sim, nгo o mata, caso nгo, o mata.
pawn Код:
forward Matar(playerid);

new Float: PosicaoX[MAX_PLAYERS];
new Float: PosicaoY[MAX_PLAYERS];
new Float: PosicaoZ[MAX_PLAYERS];

if(strcmp("/kill", cmdtext, true) == 0)
{
    new Float: PosX;
    new Float: PosY;
    new Float: PosZ;
    GetPlayerPos(playerid, PosX, PosY, PosZ);
    PosicaoX[playerid] = PosX;
    PosicaoY[playerid] = PosY;
    PosicaoZ[playerid] = PosZ;
    SetTimer("Matar", 1000, 0);
    SendClientMessage(playerid, BRANCO, "Aguarde sem se mover.");
    return 1;
}  

public Matar(playerid)
{
    new Float: PosX;
    new Float: PosY;
    new Float: PosZ;
    GetPlayerPos(playerid, PosX, PosY, PosZ);
    if(PosX == PosicaoX[playerid] && PosX == PosicaoY[playerid] && PosZ == PosicaoZ[playerid])
    {
        SetPlayerHealth(playerid, 0);
    }
    else
    {
        SendClientMessage(playerid, BRANCO, "Vocк se moveu!");
    }
    return 1;  
}
Na teoria, se vocк nгo tem conhecimento, pode parecer que isso irб funcionar, o que nгo й verdade, entгo quando descobrisse, vocк provavelmente pediria ajuda a alguйm, jб que nгo tem noзгo do que estб acontecendo.
No entanto, vocк pode fazer debug pra descobrir qual й o problema.

• Como fazer isso:

A funзгo printf й indispensбvel pra descobrir problemas como este, pois imprime no prompt do servidor o que vocк colocou dentro das aspas. Vocк pode usar qualquer outro mйtodo, seja mensagens, gametext, nгo importa.

Sabemos que nossa funзгo sу funciona pra o id 0, entгo vamos fazer o teste com debug pra o id 0, outro id qualquer, em posiзхes diferentes.
Vamos fazer o cуdigo nos dizer o que ele estб fazendo:

Coloque um printf dentro comando, pra te indicar que id de jogador foi usado pelo cуdigo e que posiзхes:

pawn Код:
printf("id de jogador: %d  posicao X obtida quando digitou: %f", playerid, PosX); // escreva o que quiser, o importante й que vocк ententa o que o cуdigo estб mostrando.
Quando o jogador que digitou o comando for o de id 0, o cуdigo irб imprimir na tela isso:
pawn Код:
id de jogador: 0  posicao X obtida quando digitou: 1234.0
Quando for o id 1:
pawn Код:
id de jogador: 1  posicao X obtida quando digitou: 4321.0
Tudo certo, atй ai tudo bem, ids diferentes e posiзхes diferentes. Sabemos que o problema nгo й aн.
Prossigamos:
Jб que o problema aparentemente nгo estб no comando, vamos ao callback "Matar(playerid)":

Coloque um printf no final do callback pra saber se o id, a posiзгo e tudo mais estгo corretos(antes do return 1):

pawn Код:
printf("id de jogador: %d  posicao X do callback: %f", playerid, PosicaoX[playerid]);
Irб imprimir quando for o jogador de id 0:
pawn Код:
id de jogador: 0 posicao X do callback: 1234.0
E quando for o de id 1:
pawn Код:
id de jogador: 0 posicao X do callback: 1234.0
O id de jogador do callback quando o jogador de 1 digitou foi 0? Por quк?

Primeiro saibamos como funciona uma funзгo:
pawn Код:
stock Dar1Real(playerid)
{
    GivePlayerMoney(playerid, 1);  
    return 1;
}
playerid й sу uma variбvel local que й criada quando a funзгo "Dar1Real" й executada, muitas pessoas podem achar que playerid й uma palavra mбgica que detecta o id do jogador. Nгo й, isto nгo passa de uma variбvel que por padrгo tem o valor de 0.
Agora que vocк sabe que playerid precisa ter um valor pra dar sentido ao cуdigo, vocк deve ter entendido que esse valor em nosso exemplo nгo foi passado pra a funзгo pelo SetTimer no comando.
Descoberto o problema, feito o debug, agora vamos resolve-lo:

SetTimer deve ser usado pra funзхes em que os parвmetros(exemplos de parвmetro: playerid, money, Float:X) nгo sгo necessбrios na ocasiгo ou nгo existem(como por exemplo: public OnfilterScriptInit()).
Entгo o SetTimer estб sendo o problema, devemos usar SetTimerEx, que quer dizer mais ou menos isso: SetTimerEspecifico

A funзгo SetTimerEx й o que precisamos pra nosso caso, os parвmetros dela sгo:
pawn Код:
SetTimerEx("NOMEDAFUNCAO", tempo, repetiзхes, "escrevemos aqui um numero/palavra ou colocamos depois da proxima virgula uma variavel pra ser colocada aqui(exemplo: id de jogador=%d nome do jogador=%s)", playerid, Name);
Entгo, como visto, se coloca ""%d", playerid)" no final do SetTimerEx pra transferirmos o id pra a funзгo quando esta for executada. Isso darб valor entгo ao playerid do callback Matar, fazendo-a funcionar pra todos ids.

O tutorial termina aqui, acho que foi possнvel entender o que й fazer debug apesar de nгo ter pensado em um exemplo mais adequado. Faзam esse tipo de coisa sempre que tiverem problemas, muita coisa se aprende errando, eu sempre pedia ajuda na comunidade Pawn do Orkut enquanto programava, sempre dependia dos outros, porйm depois que aprendi a fazer debug, deixei de criar muitos tуpicos lб.
Reply
#2

Ate que fim um tutorial Ultil mesmo.
Parabйns Jimmy Hernandez
Reply
#3

Muitoo bom mesmo cara.
Muito bem explicado!
Reply
#4

Muito Bomі..
Reply
#5

Bom Tutorial cara.
Parabйns.
Reply
#6

isso sim й um tutorial!
Reply
#7

Ficou otimo parabens bem explicado, isto sim e um verdadeiro tutoriel n aqueles lixos q dizem q й tutorial.

pawn Код:
#define BRANCO 0xFFFFFFAA
Reply
#8

Parabens, otimo tutorial.
Reply
#9

Fuckin' Great

@OFF:
pawn Код:
#define NEGAO 0x000000AA
Reply
#10

Valeu ai, pessoal.
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)