• 06 Juin 2026, 15:19:53


Auteur Sujet: Else... else if... :s  (Lu 4138 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Else... else if... :s
« Réponse #15 le: 01 Février 2008, 00:20:43 »
salut

lepro,
au cas où tu voudrais mettre une autre action si le joueur n'a pas le skin en question, :-X

tu n'as qu'a mettre un ! en avant, ;)
le ! signifie l'inverse,
donc si tu lui dit de faire une action si le joueur a le skin,
tu met un ! et se sera comme si tu lui disait s'il est faux que le joueur a le skin, fait ce qui suit....

donc le code:

if(!GetPlayerSkin(playerid) == 265) {
//action
}

 :hs
P.S. juste un truc en passant,  pour ceux qui n,aurait pas remarquer, lorsqu'on a environ 25 erreurs qui nous arrivent tout d'un coup il s'agit souvent d'une fermeture d'accolade manquant(})

fin du HS

 et voila, c a peu près ca ;)

++SIM++





Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Else... else if... :s
« Réponse #16 le: 01 Février 2008, 01:25:11 »
L'exemple que tu donnes n'est pas bon Sim.
En fait le ! (point d'exclamation) veut dire NOT (ce qui correspond effectivement plus ou moins à l'inverse).
Et un NOT en PAWN (ou C ou C++ ou ...) est une inversion de tous les bits d'une expression (variable, code retour de fonction, résultat d'un test)

Comme exemple il aurait fallu donner :
/* Si le joueur n'est pas admin */
if (!IsPlayerAdmin (playerid))

Et ton exemple aurai du s'écrire :
if (GetPlayerSkin(playerid) != 265)
ou
if (!(GetPlayerSkin(playerid) == 265))
Avec des parenthèses opur encadrer TOUT le test.

D'ailleurs, le test que tu as écrit ne sera jamais vérifié.
Démonstration :
Chaque variable est stockée sur 32 bits dans PAWN (sauf les chaines de caractères).
Donc imaginons, un joueur qui à le skin 233 (qui devrait vérifié ton test puisque tu veux ceux qui n'ont pas le 265).
La fonction GetPlayerSkin nous retourne donc 233 (=11101001 en binaire)
En fait plus exactement 00000000000000000000000011101001 (binaire sur 32 bits)
Maintenant, si on calcul !233, on trouve !00000000000000000000000011101001 = 11111111111111111111111100010110
Ce qui fait 4294967062 en décimal et donc ton test n'est pas vérifié car 4294967062 n'est pas égal à 265 (si si, je vous assure, c'est deux nombres différents).

Si il y en a qui ont pas compris, qu'il le dise, j'écrirais deux pages de plus sur l'algèbre booléenne (qu'il vous faudra apprendre par coeur).

++
Syg
Courtesy of GtaManiac

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Else... else if... :s
« Réponse #17 le: 01 Février 2008, 05:24:54 »
salut,

désolé
j'ai fait ce bout de code très rapidement

je n'ai pas regarder si la syntaxe était ok :closedeyes

mais c'est vraiment interressant a savoir exactement
(l'avis d'un pro est toujours meilleure) :D

++Sim++





Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Else... else if... :s
« Réponse #18 le: 01 Février 2008, 10:23:44 »
La syntaxe était correcte, mais le résultat non.
En fait, c'est un des gros problèmes du C/C++ et du PAWN, on peut écrire des lignes de code qui compilent mais qui font n'importe quoi (ou du moins pas ce qu'on voudrait qu'elles fassent). Et ce genre d'erreur est souvent très difficile à trouver et à corriger.

Par exemple, le point-virgule malencontreux :
if (IsPlayerAdmin (playerid));
{
   SetVehicleHealth (GetPlayerVehicleID (playerid), 1000.0);
}

Dans cette exemple, le SetVehicleHealth est exécuté, même si le joueur n'est pas admin.

Il existe des dizaines de cas dans ce genre. (= à la place de ==, nombre de % différent du nombre de paramètres dans un format, etc ...)

++
Syg
Courtesy of GtaManiac