for loop mucking up again - Printable Version
+- SA-MP Forums Archive (
https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (
https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (
https://sampforum.blast.hk/forumdisplay.php?fid=12)
+---- Forum: Help Archive (
https://sampforum.blast.hk/forumdisplay.php?fid=89)
+---- Thread: for loop mucking up again (
/showthread.php?tid=88977)
for loop mucking up again -
kazai - 30.07.2009
ok well i been programming a bit again and ran into a weird issue with 1 of my for bugs
Код:
new IsPlayerWorking[ MAX_PLAYERS ];
public othercounting()
{
if (dtime > 0)
{
new str[5];
format(str, sizeof str, "~w~%d", dtime);
for( new i = 0; i <= MAX_PLAYERS; i ++ ) // ISSUE IS HERE WITH MAX_PLAYERS
{
if (IsPlayerWorking[i])
{
GameTextForPlayer(i, str, 2500, 3);
}
}
dtime --;
dtimer = SetTimer("othercounting", 1000, 0);
}
for some reason, if i have i < MAX_PLAYERS it works, but i assume that means it would leave out the last player. i have tried i <= MAX_PLAYERS and i < MAX_PLAYERS+1 but neither work. am i doing something wrong or am i missing the point?
Re: for loop mucking up again -
paytas - 30.07.2009
Quote:
Originally Posted by kazai
but i assume that means it would leave out the last player.
|
You're wrong.
When you create an array of MAX_PLAYERS cells, say 200, then the valid cells are from 0 to 199. And the max playerid that a player can be is 199.
When you use i <= MAX_PLAYERS, the last iteration will 'call' cell 200 (IsPlayerWorking[200]), which is an invalid cell, and will most likely crash your script.
That is the correct loop:
pawn Код:
for( new i = 0; i < MAX_PLAYERS; i ++ )
Re: for loop mucking up again -
Joe Staff - 30.07.2009
Correct, besides, do you really plan on having a full server with 200 players?
Re: for loop mucking up again -
-Sneaky- - 30.07.2009
I've got something like this:
pawn Код:
// On the very top:
// UN define MAX_PLAYERS
#undef MAX_PLAYERS
// RE define MAX_PLAYERS (to the amount of your server slots)
#define MAX_PLAYERS 32
pawn Код:
// Custom loop thingy:
#define loopPlayers(%1) for (new %1=0;%1<MAX_PLAYERS;%1++) if(IsPlayerConnected(%1))
pawn Код:
// OnGameModeInit:
if(GetMaxPlayers() > MAX_PLAYERS)
{
printf("[error] Server slots (%d) is higher as MAX_PLAYERS (%d)",GetMaxPlayers,MAX_PLAYERS);
SendRconCommand("exit");
return 1;
}
pawn Код:
// Random public function
forward Sneaky();
public Sneaky()
{
loopPlayers(i)
{
SetPlayerHealth(i, 0);
}
return 1;
}