• 06 Juin 2026, 18:23:23


Auteur Sujet: If ou else if  (Lu 2468 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Karting06

  • *
  • Grand Banditisme
  • Messages: 650
    • Voir le profil
If ou else if
« 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

Hors ligne ghm94

  • *
  • Grand Banditisme
  • Messages: 886
    • Voir le profil
Re : If ou else if
« Réponse #1 le: 24 Mai 2011, 20:07:36 »
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.

Hors ligne D4MI3N

  • Directeur 4pple Helper
  • *
  • Tueur en série
  • Directeur 4pple Helper
  • Messages: 169
    • Voir le profil
    • Directeur 4pple Helper
Re : If ou else if
« Réponse #2 le: 24 Mai 2011, 20:57:08 »
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

Hors ligne ghm94

  • *
  • Grand Banditisme
  • Messages: 886
    • Voir le profil
Re : If ou else if
« Réponse #3 le: 24 Mai 2011, 21:00:33 »
Non c'est :
If = Si
Else = Sinon
Else if = Sinon, si....

Puis je crois que ta pas trop compris sa question

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : If ou else if
« Réponse #4 le: 24 Mai 2011, 21:03:10 »
C'était moi le quelqu'un d'autre :p

Sinon, c'est exactement ce qu'a dit ghm94



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

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : If ou else if
« Réponse #5 le: 24 Mai 2011, 22:54:45 »
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
Courtesy of GtaManiac

Hors ligne ghm94

  • *
  • Grand Banditisme
  • Messages: 886
    • Voir le profil
Re : If ou else if
« Réponse #6 le: 24 Mai 2011, 22:58:06 »
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 ?

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : If ou else if
« Réponse #7 le: 24 Mai 2011, 23:25:23 »
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:
{
}
}




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

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : If ou else if
« Réponse #8 le: 24 Mai 2011, 23:28:19 »
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

++
Syg
Courtesy of GtaManiac

Hors ligne ghm94

  • *
  • Grand Banditisme
  • Messages: 886
    • Voir le profil
Re : If ou else if
« Réponse #9 le: 24 Mai 2011, 23:31:51 »
Ok merci à vous 2 pour ces informations :)

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : If ou else if
« Réponse #10 le: 24 Mai 2011, 23:36:04 »
En faite ce que j'ai dit est impertinent, n'en prenez pas compte lol



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

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : If ou else if
« Réponse #11 le: 24 Mai 2011, 23:38:00 »
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
Courtesy of GtaManiac

Hors ligne Karting06

  • *
  • Grand Banditisme
  • Messages: 650
    • Voir le profil
Re : If ou else if
« Réponse #12 le: 25 Mai 2011, 07:45:53 »
Merci à tous pour l'informations.
Et désolé d'avoir oublié ton nom Sasuke ! :)

Hors ligne Xartrick

  • *
  • C & Pawn Programmer
  • Messages: 1391
    • Voir le profil
    • Xartrick's Area
Re : If ou else if
« Réponse #13 le: 25 Mai 2011, 13:00:35 »
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.

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : If ou else if
« Réponse #14 le: 25 Mai 2011, 13:44:59 »
Je vais vous expliquez comment fonctionne, les deux ^^   


<?php
if( 
valeur == )
{
}
else if( valeur == )
{
}
else if( valeur == )
{
}
else if( valeur == )
{
}
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.
« Modifié: 25 Mai 2011, 14:58:05 par Ssk »



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