• 04 Juillet 2025, 11:54:53


Auteur Sujet: le for  (Lu 1416 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne karimos

  • *
  • Nouveau
  • Messages: 15
    • Voir le profil
le for
« le: 06 Janvier 2012, 09:24:53 »
bonjours j'ai une petite question concernant le for :



for ( new i = 0; i < MAX_PLAYER; i++)
{
   SendClientMessage(playerid, COLOR_RED, "test");
}

par exemple il y'a 20 de connecte
il va envoyer les 20 message puis frapper dans le vide pour rien

faut mettre cela pour qu'il arrete??

for ( new i = 0; i < MAX_PLAYER; i++)
{
   if(IsPlayerConnected(i))
{
    SendClientMessage(playerid, COLOR_RED, "test");
}
  else {return break;}
}

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : le for
« Réponse #1 le: 06 Janvier 2012, 10:23:14 »
Salut,
Pas besoin d'arrêter la boucle comme ça, tu as juste à changer MAX_PLAYERS (Et pas MAX_PLAYER, je précise) par le nombre de joueurs :

for ( new 020i++)
{
   
SendClientMessage(playeridCOLOR_RED"test");
}


Sinon, 2e solution : MAX_PLAYERS vaut 800, mais tu peux changer sa valeur en haut de ton script :

#undef MAX_PLAYERS  // On supprime la constante, sinon on ne peut pas changer sa valeur.
#define MAX_PLAYERS 20 // On recrée la constante avec une nouvelle valeur.

Avec ça tu peux toujours utiliser MAX_PLAYERS, ce qui est mieux, car si tu changes de nombre de slots, tu auras juste à changer la valeur de la constante plutôt que de changer dans chaque boucle ;)

++

Hors ligne spiirou

  • *
  • L'avenir appartient à ceux qui se lèvent
  • Messages: 866
    • Voir le profil
Re : le for
« Réponse #2 le: 06 Janvier 2012, 10:30:34 »
Ou sinon tu peux faire ceci je pense :

#undef MAX_PLAYERS  // On supprime la constante, sinon on ne peut pas changer sa valeur.
#define MAX_PLAYERS GetMaxPlayers() // On recrée la constante avec la valeur suivante: le nombre de slots du serveur.

Hors ligne spiirou

  • *
  • L'avenir appartient à ceux qui se lèvent
  • Messages: 866
    • Voir le profil
Re : le for
« Réponse #3 le: 06 Janvier 2012, 11:20:25 »
C'est ce que j'avais ecrit Citron :) Mais tu as apporté l'explication en plus, merci ;)

Hors ligne Xartrick

  • *
  • C & Pawn Programmer
  • Messages: 1391
    • Voir le profil
    • Xartrick's Area
Re : le for
« Réponse #4 le: 06 Janvier 2012, 18:57:33 »
for (new i = 0; i < MAX_PLAYER; i++)
{
    if (IsPlayerConnected(i))
    {
        SendClientMessage(playerid, COLOR_RED, "test");
    }
    else
    {
        return break;
    }
}

Ce code n'exécutera pas tout le temps la condition, si un joueur n'est pas connecté, on sort de la boucle.
L'instruction break te fera sortir de la boucle dans ce cas.
Pour palier à ce problème, tu peux retirer le bloc else.

Hors ligne spiirou

  • *
  • L'avenir appartient à ceux qui se lèvent
  • Messages: 866
    • Voir le profil
Re : le for
« Réponse #5 le: 06 Janvier 2012, 20:02:31 »
Mais avec le break tu sors du For ? Si c'est ca c'est pas du tout correct !
Parce que si l'ID 3 est pas connecté mais qu'il y en a au dessus ca n'ira pas.

Je pense que utiliser GetMaxPlayers() ET IsPlayerConnected() est le plus simple, et le plus correct

Hors ligne Xartrick

  • *
  • C & Pawn Programmer
  • Messages: 1391
    • Voir le profil
    • Xartrick's Area
Re : le for
« Réponse #6 le: 06 Janvier 2012, 20:24:17 »
Mettre une fonction dans la condition de la boucle n'est pas très optimisé, voici pourquoi.

#include <a_samp>

forward fFunction();

main()
{
    new i = 0;

    for (i = 0; i < fFunction(); i++)
        printf("+");
}

public fFunction()
{
    printf("CALL: fFunction()");

    return 10;
}

[20:15:28] CALL: fFunction()
[20:15:28] +
[20:15:28] CALL: fFunction()
[20:15:28] +
[20:15:28] CALL: fFunction()
[20:15:28] +
[20:15:28] CALL: fFunction()
[20:15:28] +
[20:15:28] CALL: fFunction()
[20:15:28] +
[20:15:28] CALL: fFunction()
[20:15:28] +
[20:15:28] CALL: fFunction()
[20:15:28] +
[20:15:28] CALL: fFunction()
[20:15:28] +
[20:15:28] CALL: fFunction()
[20:15:28] +
[20:15:28] CALL: fFunction()
[20:15:28] +

À chaque fois, la fonction est appelé, vaut mieux stocker le résultat dans une variable et s'en servir par la suite, question de rapidité d'exécution.
Ce qu'on cherche à obtenir, c'est ceci.


[20:15:28] CALL: fFunction()
[20:15:28] +
[20:15:28] +
[20:15:28] +
[20:15:28] +
[20:15:28] +
[20:15:28] +
[20:15:28] +
[20:15:28] +
[20:15:28] +
[20:15:28] +

#include <a_samp>

forward fFunction();

main()
{
    new i = 0,
        j = fFunction();

    for (i = 0; i < j; i++)
        printf("+");
}

public fFunction()
{
    printf("CALL: fFunction()");

    return 10;
}

Dans le contexte d'une boucle, l'instruction break sort de la boucle.

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : le for
« Réponse #7 le: 07 Janvier 2012, 19:28:29 »
Salut,

ta solution, spiirou,est très dangereuse.

La fonction GetMaxPlayer est disponible seulement dans les fonctions. En remplaçant ainsi une constante par une fonction, tu amène ce problème:

new mavariable[MAX_PLAYERS];
plus aucune déclaration de ce genre ne sera fonctionnelle...
La solution idéale c'est de modifier la valeur de MAX_PLAYERS à la main avec la méthode de Gilux et dans les boucles comportant plus d'une instruction utiliser un IsPlayerConnected vaut la peine.

Exemple:
for(new i = 0; i < MAX_PLAYERS; i++)
{
    SendClientMessage(i, COLOR_GREEN, "Bravo, tu as reçu ce message!");
}

for(new i = 0; i < MAX_PLAYERS; i++)
{
    if(IsPlayerConnected(i))
    {
        SetPlayerInterior(i, 1);
        SetPlayerVirtualWorld(i, i);//tous des vw différents
        SetPlayerPos(i, 1982.321, 1243.3213, 1005.31);
    }
}

Voila, la raison: la plupart des fonctions font en elle-même le test pour vérifier si le joueur est connecté, ça évite des problèmes pour les scripteurs inattentifs, donc lancer une fonction sur tous les joueurs même ceux qui ne sont pas connectés ne pose aucun problème.
Toutefois, dans le second cas, si le joueur n'est pas connecté, 3 fonctions sont appelées inutilement. L'ajout du test IsPlayerConnected permet donc de réduire ce nombre à 1 dans ces cas.

Cordialement,
++Sim++





Hors ligne spiirou

  • *
  • L'avenir appartient à ceux qui se lèvent
  • Messages: 866
    • Voir le profil
Re : le for
« Réponse #8 le: 07 Janvier 2012, 20:11:22 »
Merci pour cette explication Sim :)

Hors ligne karimos

  • *
  • Nouveau
  • Messages: 15
    • Voir le profil
Re : le for
« Réponse #9 le: 07 Janvier 2012, 22:23:56 »
merci pour vos reponse cependant ma function:

for(new i = 0; i < MAX_PLAYERS; i++)
{
    if(IsPlayerConnected(i))
    {
        SetPlayerInterior(i, 1);
        SetPlayerVirtualWorld(i, i);//tous des vw différents
        SetPlayerPos(i, 1982.321, 1243.3213, 1005.31);
    }
    else
    {
      return break;
    }

}

elle va envoyer l'id 0 puis 1 puis 2 puis 3....quelle est l'erreur??

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : le for
« Réponse #10 le: 07 Janvier 2012, 23:10:01 »
Le else et son bloc d'instruction est inutile, retires les ;)



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne Xartrick

  • *
  • C & Pawn Programmer
  • Messages: 1391
    • Voir le profil
    • Xartrick's Area
Re : le for
« Réponse #11 le: 07 Janvier 2012, 23:16:38 »
Je réponds à cette question dans l'un de mes messages de ce topic.

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : le for
« Réponse #12 le: 08 Janvier 2012, 12:50:40 »
Yep, j'avais vu mais apparemment il n'a pas compris ^^



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog