GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Karting06 le 24 Mai 2011, 19:35:01
-
Bonjour à tous,
En lisant le DM Bled de Damien. Gzsume et quelqu'un d'autre (désolé j'ai oublié le nom) disait qu'il fallait utilisé "else if" quand on utilise plusieurs "if". Comment par exemple, dans le "OnPlayerSpawn".
Mais quel est l'avantage ? (ou l'incovénient ?)
La vitesse du scripte ?
Je sais la question est peut-être bête, mais pourrait aider les programmeurs.
Cordialement,
Karting06
-
Je pense que c'est parce-que si tu met que des if comme ceci :
if(Condition 1){}
if(Condition 2){}
if(Condition 3){}
Admettons que seul la première condition soit bonne, le script vérifia quand même les autres ce qui lui fera perdre du temps.
Alors que comme ça :
if(Condition 1){}
else if(Condition 2){}
else if(Condition 3){}
Si c'est toujours la condition 1 qui est bonne le script ne perdra pas son temps à vérifier les autres.
-
Les Else et If disent que si j'ai temps d'argent et que je n'ai pas assez je ne peut pas acheter exemple :
if(GetPlayerMoney(playerid) < 500) return SendClientMessage(playerid,0xFF0000AA, "Vous n'avez pas assez d'argent ! Vous devez avoir 500$!"); // Il disent que si tu a moins de 500 $ l'action s'arrete et que un message d'affiche
GivePlayerWeapon(playerid, 33, 5000); // si ta plus de 500 $ L'action continu , tu donne l'arme
PlayerPlaySound(playerid,1057); //un Ptit sound :D
GivePlayerMoney(playerid,-500); // on enlève 500 $
GameTextForPlayer(playerid, "Arme ~g~Achete", 2000, 6); // Un Ptit GametextforPlayer :D
Voila ta compris Vite fait :D
C'est If = Si
Else = De plus ( Je crois )
++ Damien
-
Non c'est :
If = Si
Else = Sinon
Else if = Sinon, si....
Puis je crois que ta pas trop compris sa question
-
C'était moi le quelqu'un d'autre :p
Sinon, c'est exactement ce qu'a dit ghm94
-
Et exactement pas ce qu'à dit D4MI3N .... :P
Même si son bout de code montre comment se passer d'un else (chose que je n'aime pas mais chacun sa façon de faire).
On peut aussi noter l'existence de switch qui permet de "simplifier" l'écriture d'un if/else if/else à rallonge lorsqu'on compare une variable à un certains nombre de valeurs (Même si la simplification n'est pas évidente à première vue) :
if (a==1)
{
printf ("A=1");
}
else if (a==2)
{
printf ("A=2");
}
else if (a==3)
{
printf ("A=3");
}
else
{
printf ("A ne vaut ni 1, ni 2, ni 3");
}est équivalent à
switch (a)
{
case 1:
{
printf ("A = 1");
}
case 2:
{
printf ("A = 2");
}
case 3:
{
printf ("A = 3");
}
default:
{
printf ("A ne vaut ni 1, ni 2, ni 3");
}
}
NB : un switch s'exécute un peu plus rapidement qu'une suite de else if
++
Syg
-
Le break n'est pas nécessaire en Pawn pour éviter que le script ne continue pas de tester les autres condition s'il trouve la bonne avant la fin ?
-
Normalement pas besoin, en gros je t'explique ( selon la conversion du C, en assembleur )
un switch en C, se transforme comme ça en assembleur.
Tableau[ 7 ] =
{
case_default, case_1, case_2, case_default, case_default, case_default, case_6
};
ensuite
appel Tableau[ valeur ];
en pawn
<?php
switch( valeur )
{
case 1:
{
}
case 2:
{
}
case 6:
{
}
default:
{
}
}
-
Non, surtout pas de break il ne sert absolument à rien en PAWN dans un case, (contrairement au C où il est nécessaire pour éviter l'exécution de tous les case suivants).
De plus, il ne peut y avoir qu'une expression derrière un case, si on veut en mettre plusieurs, il faut les encadrer par des accolades.
Le code suivant provoque une erreur de compilation en PAWN (mais pas en C) :
switch (a)
{
case 1:
printf ("A=1");
a++; // Cette ligne est en trop et provoque un erreur de compilation
default:
printf ("A est différent de 1");
}Résultat de la compilation :
error 002: only a single statement (or expression) can follow each "case"
NB : Ce simple fait rend inutile l'emploi de break (qui devra de toutes façon se trouver dans un bloc entre accolades sous le case)
Pour corriger l'erreur, il faut mettre des accolades :
switch (a)
{
case 1:
{
printf ("A=1");
a++;
}
default:
printf ("A est différent de 1"); // Pas d'accolade nécessaire car une seule ligne
}
De plus, le PAWN est beaucoup plus permissif que le C concernant le case, il est possible d'y mettre plusieurs valeurs ou une plage de valeurs consécutives (qui se suivent) :
switch (a)
{
case 1,3: //plusieurs valeurs
printf ("A vaut 1 ou 3");
case 2:
printf ("A vaut 2");
case 4..8: // Plage de valeurs consécutives (4, 5, 6, 7, ou 8)
printf ("A est compris entre 4 et 8");
default:
printf ("A=%d", a);
}
Et pour ceux qui se demande comment je sais tout ça et bien c'est parce que j'ai lu LA bible : http://www.compuphase.com/pawn/Pawn_Language_Guide.pdf (http://www.compuphase.com/pawn/Pawn_Language_Guide.pdf)
++
Syg
-
Ok merci à vous 2 pour ces informations :)
-
En faite ce que j'ai dit est impertinent, n'en prenez pas compte lol
-
Si c'est pertinent pour étayer le fait que le switch/case est plus rapide que le if/else if/else.
Car en PAWN, la compilation doit sensiblement donner le même résultat qu'en C.
++
Syg
-
Merci à tous pour l'informations.
Et désolé d'avoir oublié ton nom Sasuke ! :)
-
Il me semble que la condition if ... else ... else if passe par un switch, ce qui expliquerait le fait que le switch soit plus rapide.
-
Je vais vous expliquez comment fonctionne, les deux ^^
<?php
if( valeur == 6 )
{
}
else if( valeur == 4 )
{
}
else if( valeur == 5 )
{
}
else if( valeur == 1 )
{
}
else
{
}
Si valeur vaut 6
sinon si valeur vaut 4
sinon si valeur vaut 5
sinon si valeur vaut 1
sinon ...
On voit que par exemple la, si valeur vaut 1, alors il va se passer 3 instruction avant d'arriver à l'endroit où l'ont test 1
mais avec un switch ça se passe comme ça
switch( valeur )
{
case 6:
{
}
case 5:
{
}
case 4:
{
}
case 1:
{
}
default:
{
}
}
devient
Tableau[ 7 ] =
{
default, case_1, default, default, case_4, case_5, case_6
};
si valeur < 0
valeur = 0
si valeur > 6
valeur = 0
appel Tableau[ valeur ]
Tout se passe TOUJOURS en trois instructions, donc le code est plus rapide mais seulement si on plus de 3 conditions à tester.
-
Les if/else if/else ne peuvent être remplacer par un switch que dans le cas très précis où l'on compare une variable à plusieurs valeurs.
Le code suivant :
if (!IsPlayerInAnyVehicle (playerid)
{
printf ("Le joueur est à pied");
}
else if (GetVehicleModel (GetPlayerVehicleID (playerid)) == 522)
{
printf ("Le joueur est en NRG-500");
}
else
{
printf ("Le joueur est dans un véhicule autre que NRG-500");
}
ne peut pas être remplacer par un switch.
De toutes façons, la différence de temps d'exécution est très certainement négligeable. Donc le mieux c'est de faire comme on a l'habitude de faire. C'est plus facile de se relire.
++
Syg