Bienvenue, Invité. Veuillez vous connecter ou vous inscrire.
Avez-vous perdu votre courriel d'activation?
Connexion avec identifiant, mot de passe et durée de la session

 
avancée

254687 Messages dans 14036 Fils de discussion- par 6619 Membres - Dernier membre: djalal

23 Mai 2012 à 05:47:01
GTAOnline.frSan Andreas MultiplayerScripting SA-MP [Pawn center] (Modérateurs: S!m, Xartrick)le for
Pages: [1]   Bas de page
Imprimer
Auteur Fil de discussion: le for  (Lu 201 fois)
0 Membres et 2 Invités sur ce fil de discussion.
karimos
Hors ligne Hors ligne

Petit nouveau
*

Messages: 11


« le: 06 Janvier 2012 à 09:24:53 »

bonjours j'ai une petite question concernant le for :


Code:

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??

Code:
for ( new i = 0; i < MAX_PLAYER; i++)
{
   if(IsPlayerConnected(i))
{
    SendClientMessage(playerid, COLOR_RED, "test");
}
  else {return break;}
}
Journalisée
Gilux
Hors ligne Hors ligne

GTAOnline Addict
*

Messages: 1296


WWW
« Répondre #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 Clin d'oeil

++
Journalisée


spiirou
Hors ligne Hors ligne


Admin Frag'n'Fun
GTAOnline Big Member
*

Messages: 573


« Répondre #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.
Journalisée





Gzsume
« J'apprends donc je suis »
Hors ligne Hors ligne


Team NSG
GTAOnline Fan Boy
*

Messages: 2114


« Répondre #3 le: 06 Janvier 2012 à 11:05:52 »

Ou alors, simplement utiliser la fonction GetMaxPlayers plutôt que la constante MAX_PLAYERS. D'ailleurs, en parlant de cette constante, il faut savoir que pour le compilateur, c'est un nombre, rien d'autre. C'est simplement une sorte de raccourci avec une valeur prédéfinie (à savoir, 700 si je ne me trompe pas avec SA-MP). Cette valeur peut changer, mais uniquement lors des changements de versions de SA-MP (lorsque le nombre maximum de joueurs est repoussé). D'où l'utilité de la fonction GetMaxPlayers, qui permet d'éviter d'avoir des tonnes de boucles assez lourdes et inutiles.
Journalisée



« Dans la vie, il faut savoir
transformer les citrons en limonade. »



spiirou
Hors ligne Hors ligne


Admin Frag'n'Fun
GTAOnline Big Member
*

Messages: 573


« Répondre #4 le: 06 Janvier 2012 à 11:20:25 »

C'est ce que j'avais ecrit Citron Sourire Mais tu as apporté l'explication en plus, merci Clin d'oeil
Journalisée





Xartrick
Hors ligne Hors ligne


Moderateur
GTAOnline Addict
*

C & Pawn Programmer

Messages: 1206


WWW
« Répondre #5 le: 06 Janvier 2012 à 18:57:33 »

Code:
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.
Journalisée

spiirou
Hors ligne Hors ligne


Admin Frag'n'Fun
GTAOnline Big Member
*

Messages: 573


« Répondre #6 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
Journalisée





Xartrick
Hors ligne Hors ligne


Moderateur
GTAOnline Addict
*

C & Pawn Programmer

Messages: 1206


WWW
« Répondre #7 le: 06 Janvier 2012 à 20:24:17 »

Mettre une fonction dans la condition de la boucle n'est pas très optimisé, voici pourquoi.

Code:
#include <a_samp>

forward fFunction();

main()
{
    new i = 0;

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

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

    return 10;
}

Code:
[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.


Code:
[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] +

Code:
#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.
Journalisée

S!m
Hors ligne Hors ligne


Moderateur
GTAOnline Fan Boy
*

Messages: 2260


« Répondre #8 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:

Code:
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:
Code:
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++
Journalisée





spiirou
Hors ligne Hors ligne


Admin Frag'n'Fun
GTAOnline Big Member
*

Messages: 573


« Répondre #9 le: 07 Janvier 2012 à 20:11:22 »

Merci pour cette explication Sim Sourire
Journalisée





karimos
Hors ligne Hors ligne

Petit nouveau
*

Messages: 11


« Répondre #10 le: 07 Janvier 2012 à 22:23:56 »

merci pour vos reponse cependant ma function:

Code:
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??
Journalisée
Ssk
Développeur d'Open SA-MP
Hors ligne Hors ligne


Sous-admin
GTAOnline Legend
*

Open-SA-MP - Unlimited Experience

Messages: 3727


WWW



sasuke78200

« Répondre #11 le: 07 Janvier 2012 à 23:10:01 »

Le else et son bloc d'instruction est inutile, retires les Clin d'oeil
Journalisée






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


Moderateur
GTAOnline Addict
*

C & Pawn Programmer

Messages: 1206


WWW
« Répondre #12 le: 07 Janvier 2012 à 23:16:38 »

Je réponds à cette question dans l'un de mes messages de ce topic.
Journalisée

Ssk
Développeur d'Open SA-MP
Hors ligne Hors ligne


Sous-admin
GTAOnline Legend
*

Open-SA-MP - Unlimited Experience

Messages: 3727


WWW



sasuke78200

« Répondre #13 le: 08 Janvier 2012 à 12:50:40 »

Yep, j'avais vu mais apparemment il n'a pas compris ^^
Journalisée






Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog
Pages: [1]   Haut de page
Imprimer
Aller à:  

Theme créé par padexx et modifié par GTAOnline.fr
Page générée en 0.133 secondes avec 22 requêtes.
Forum GTAOnline.fr 2.0 | Design par : Lalu et GtaManiac
Merci a toute la communaute pour son support !
Copyright © 2004-2012 - GTAOnline.fr | GTAPro.com | Contact