switch, int et constantes

Répondre
Partager Rechercher
bon, alors ceci est en fait un post pour demander des précisions sur la syntaxeee
je commence a vouloir faire des trucs un peu "custom" prenant en compte des tas de trucs, comme, au hasard, la race
donc, si g bien compris, comme 36000 if else c pas bien, pis surtt c illisible, j'ai éssayé d'utiliser le switch
et comme g vu
Code PHP:

int GetRacialType(object oCreature
avec un zoli int devant, ba me suis dit, super, on va faire un switch decu
donc g fait des trucs du genre
Code PHP:

string sTxt;
string sTxt2;
string sTxt3;
switch(
GetRacialType(OBJECT_SELF))
{
case 
RACIAL_TYPE_DWARF:
sTxt "blablanain";
sTxt2 "blablanain";
sTxt3 "blablanain";
break;
case 
RACIAL_TYPE_ELF :
sTxt "blablaelfe";
sTxt2 "blablaelfe";
sTxt3 "blablaelfe";
break;

je suis allé voir le post sur l'utilisation du onhit, et g vu la syntax

Code PHP:

string sTxt;
string sTxt2;
string sTxt3;
switch(
nRace)
{
case 
RACIAL_TYPE_DWARF:
sTxt "blablanain";
sTxt2 "blablanain";
sTxt3 "blablanain"; }
case 
RACIAL_TYPE_ELF :
sTxt "blablaelfe";
sTxt2 "blablaelfe";
sTxt3 "blablaelfe"; }


alors, il semble bien qu'on puisse faire des switch sur d'autre truc que des chiffres, si c'est des int
ma question
1 laquelle des syntax est a utiliser ? si ca dépend des cas, ba ds quelle cas ? ca fait une différence quelconque ou pas ?

2 (ouais, en fait c pas "ma" que j'aurais du mettre) est ce qu'on peut définir nos propres int avec des lettres (des constante quoi .. c ca ? je pense en avoir vu dans plusieurs biblio qui trainent ) ? je sais pas si ca a un interet quelconque, mais est ce que c'est a ca que sert StringToInt ? parce que dans ce cas plus la peine de passer par des if else etc. quand ca dépend du tag par exemple ... enfin, je dis ca pour moi, pour ce que g fais avant

3 pas grd chose à voir, mais est ce qu'il y a un pitit tut ou une explication quelconque pour l'utilisation de la bibliothèque de Tynril qui gère les tokens, j'en avait entendu parler ici, g trouvé ca dans les cript de la taverne de RAT, mais je vois pas comment l'utiliser ^_~ g bo cherché, mais pas trouvé vais continuer à chercher, mais si zaviez le liens ...

4 pour les retour, je suis pas trop sur demoi, donc si vous pouviez donné un syntaxe chapter approuved notament avec les histoire de default, est ce qu'il faut dire "return" dans les "case" ou a la fin du switch ? et quel sens ca a return, ca arrête la fonction ou ca renvoi la valeur ? (ou bien les deux ou encore autre chose)

rq, j'ai répondu à la plupart des question tout seul, en testant, mais bon, si zaviez des précisions , en fait, je voulais poster ce topic parce que j'avais des pb de compilations sur des switch, mais après coup il s'avère que ce sont des fautes de rigueur sur les parenthèses .... donc si vous trouvez que ce topic ne sert à rien, voila la réponse
1 ) Aucune différence dans le fonctionnement, c'est juste plus "propre", par ailleurs il faut un break même si on met les accolades, ton 2e script risque donc de mal fonctionner.

2 ) int, c'est un integer, c'est à dire un entier, donc un nombre, c'est le seul type utilisable pour le switch (ce qui lui confère d'ailleurs une rapidité incomparable par rapport à un if...else if.... même si celui-ci se contente de tester des entiers)
Je ne suis plus sûr pour les constantes, mais il me semblait qu'il était impossible d'en rajouter des "vraies", c'est à dire que les pseudo-constantes que tu as pu trouver dans des bibliothèques sont en réalité des variables écrites en majuscules. Donc inutilisable avec un switch qui n'accepte que les vraies constantes.
(Y a moyen de faire ça avec le compilateur de Torlack mais bon...)

3 ) La bibliothèque de token, c'est la mienne, pas celle de Tynril (sans vouloir nier ses éminentes réalisations), elle est relativement simple à utiliser, là tu auras la dernière version sous forme de zip=>erf (avec un petit manuel) :
http://perso.wanadoo.fr/jedai.fou/nwl_tokcust2.zip
et à cette adresse tu as un mini module de démo :
http://perso.wanadoo.fr/jedai.fou/token.zip

Voilà !
N'hésite pas à poser des questions ou à faire des suggestions !

4 ) Avec les switch, y a pas de return, y a des break, comme dans ton premier exemple, il sert à arrêter l'exécution du switch après qu'on ait exécuter le bon cas.
Mais il n'est pas obligatoire : si tu ne le met pas, le cas suivant s'exécutera, jusqu'à ce qu'un break soit rencontré en fait, d'ailleurs tu peux en mettre à l'intérieur d'un case et pas à la fin, si tu veux.

Le return est assez différent, il sert effectivement à arrêter l'exécution d'une fonction, tout en retournant une valeur correspondant au type de retour de la fonction (float, int, string, etc...), si le type de retour de la fonction est "void", on ne met pas de valeur à retourner, mais l'exécution de la fonction est quand même arrêtée, et on revient au programme appelant.
exemple :
Code PHP:

int Two()
{
  return 
2;
  
SpeakString"Je ne prononcerais jamais cette phrase !! ;-) " );
}

void main()
{
  
int nTwo Two();

  if( 
nTwo == ) return;  

  
SpeakString"Je ne prononcerais jamais cette phrase non plus !! Incroyable non ! " );

Voilà, j'espère avoir répondu à certaines de tes questions
J'ai vérifié et j'ai constaté qu'il y avait aussi la bibliothèque de token de Tynril dans la taverne de RAT (en fait c'est pas vraiment la sienne, celle-là mais bon...), donc je ne sais plus de laquelle tu parles ?
Quel est le but auquel tu pensais employer cette bibliothèque : pensais tu aux tokens comme on en rencontre dans les dialogues ( <FullName>, <Lord/Lady>, etc...), ou aux tokens tels qu'on les rencontre souvent dans les langages de programmation, c'est à dire une partie d'une chaîne de caractères qu'on a découpé selon un caractère précis ?
Dans le premier cas tu dois employer ma bibliothèque, qui est assez efficace pour ce genre de chose, dans le deuxième, tu dois employer celle de Tyn' (enfin celle qu'il a récupéré quelque part).
en fait, j'avais vu la sienne comme un truc pour découper/torturer des string (donc g t pas loin ) mais ne connaissant aps la signification de token en prog, et ne l'ayant vu que qd on parlait de ta biblio ou trucs ds ce genre, ba je m'interrogeait
merci en tout cas pour ta biblio sur les token, va me servir aussi
l'autre je vais aussi la réemployer

pour le return ... mmm ... je crois avoir compris, en tout cas ca éclaire
si g un pb je n'hésiterais pas à l'étaler ^_^
Vi j'ai récupérer je crois deux fonctions de celle de Tyn (enfin de la personne qu'il a fait ) et elle est quand même pratique il faut bien avouer, et surtout c'est du temps en moins de gagné à ne pas faire de nouvelle fonction .
tiens, tant que j'y suis, est ce qu'il faut un ";" après un switch ?
passke j'en ai pas mis, mais j'en ai vu parfois ... c comme les { , c juste pour faire propre ?
le ";" pour le c , c'est pour prévenir la fin d'une instruction.
Normalement tu pourrais mettre par exemple

Code PHP:

int nNum=1object oPC=OBJECT_SELF
Même si cela s'écrit, peu de personne le font d'un point de vue visibilité et prefere l'écrire comme ça :

Code PHP:

int nNum=1;
 
object oPC=OBJECT_SELF
Donc voilà, le ";" sert à finir une instruction, cela veut dire que si tu ne le mets pas il va, si je me trompe pas essayer de le concatener obligatoirement.

donc pour un switch ()

une écriture tout à fait plausible.

Code PHP:

int nNum=Random(3);
string txt;
switch (
nNum)
{
case 
0txt="bonjour";
break;
case 
1txt="Aurevoir";
break;
case 
2txt="A bientôt";
break;

Si tu n'avais pas mis par exemple de ; a la fin du int, l'ordinateur n'aurai pas compris que c'était la fin de l'instruciton et il aurait lu de cette façon là:

Code PHP:

int nNum=Random(3)string txt;
switch (
nNum)
{
case 
0txt="bonjour";
break;
case 
1txt="Aurevoir";
break;
case 
2txt="A bientôt";
break;

Créant obligatoirement une erreur

Mais sinon, à la fin de l'instruction , en aucun cas tu es obligé de mettre ";" à la fin du switch car il y a déjà les {} qui gère cela
ou le break;

Voilou
et pour aider!
Bon un petit tutorial pour vous aider à simplifier votre code quand vous pouvez.

normal :
Code PHP:

if (nNum==1)
{
txt="bonjour";}
else
{
txt="Aurevoir";} 
Simplifié :
Code PHP:

if (nNum==1)
txt="bonjour";
else
txt="Aurevoir"
Comme il y a qu'une seule instruction dans la condition, vous n'êtes pas obligés d'utiliser les {}. Idem pour les autres.

Normal avec for:

Code PHP:

nNum=0;
for (;
nNum<=3;nNum++)
{
txt=IntToString(nNum);} 
Simplifié :
Code PHP:

nNum=0;
for (;
nNum<=3;nNum++)
txt=IntToString(nNum); 
En résumé, vous pouvez quand c'est une seule et une unique instruction retirer à chaque fois les { } pour simplifier le code.
chat j'avais capté
ce qui me turlupine c'est plutot ce genre de chose
Code PHP:

int nNum=Random(3);
string txt;
switch (
nNum)
{
case 
0txt="bonjour";
break;
case 
1txt="Aurevoir";
break;
case 
2txt="A bientôt";
break;
}; 
avé le ";" après la parenthèse du switch
ca compil aussi, mais ca change qq chose ?
en raisonnant comme tu l'explique, je vois pas ce que ca change, mais bon, c pas mon métier non plus
Oui ça compile, c'est normal, ton ";" indique la fin d'une instruction, meme si il n'y a pas d'instruction, atention certain compilateur prennent ça comme une erreure de syntaxe (enfin en ce qui concerne le c ou le c++)

maintenant, ça change pas grand chose, car {} (acolade et non pas parenthese) indique un bloc d'instruction devant etre executées.

De mémoire, il me semble qu'en C++ les seul "blocs" necessitant un ";" à la fin est la définition d'une classe et on ne peut pas vraiment appler ça un Bloc d'instruction....
Citation :
Provient du message de Reyan
chat j'avais capté
ce qui me turlupine c'est plutot ce genre de chose
Code PHP:

int nNum=Random(3);
string txt;
switch (
nNum)
{
case 
0txt="bonjour";
break;
case 
1txt="Aurevoir";
break;
case 
2txt="A bientôt";
break;
}; 
avé le ";" après la parenthèse du switch
ca compil aussi, mais ca change qq chose ?
en raisonnant comme tu l'explique, je vois pas ce que ca change, mais bon, c pas mon métier non plus
Ba je le dis dans mon explications , normalement on ne met pas de ; à la fin d'un switch comme il y a les {} qui s'occupe déjà de ça.
Enfin en résumé, c'est comme dit Prophetia Astrae
Pour ajouer des constantes compatibles avec les switch, il faut les ajouter au fichier nwscripts.nss (dispo en affichant toutes lese ressources lorsque vous chargez le script)

Cependant, il arrive que la modification de ce fichier fasse planter le compilateur. GARDEZ TOUJOURS UNE COPIE DU FICHIER QUI MARCHE DES QUE VOUS LE MODIFEZ.

un autre truc : ne passez JAMAIS par la commande "compilez" pour la sauvegarde de votre nwscripts.nss, sinon la aussi vous allez tout faire planter. utilisez l'onglet "enregistrer" pour le faire.

Si jamais votre compilateur plante (en général, ca se traduit par le fait qu'il ne trouve pas les fonction originale), vous n'avez qu'a restaurer votre fichier .nss comme il ét au début, et sa marche

Un peu galère, mais telement plus facile de pouvoir utiliser des constantes dans les switchs
Il me semble qu'en c++ le switch permet de tester autre chose que des int pourquoi ce n'est pas le cas dans nwn

Et une autre question, j'ai un petit script où il y a une succession de "else if" qui testent un int, mais ce n'est pas un test d'égalité, mais une inégalité, je peux le transformer en case ?

Code PHP:

int i qqch();

if (
30)
bidule;
else if (
>= 25)
bidule;
else if (
>= 20)
bidule;
else if (
>= 15)
bidule;
else
bidule
Si jedaï le C# le gère . Mais bon c'était juste pour le dire lol sinon c'est vrai que le C ne s'en occupe pas .

Reyan à quoi sert les elses??

Ba c'est plus facile à écrire et plus rapide surtout , un code qui demande par exemple:

Code PHP:

if (sDial=="Bonjour")
.....;
else
.....; 
je fais ça très rapidement l

Code PHP:

switch (sDial)
case 
"bonjour": .... break;
default : ..... break; 
Sinon pour des conditions simples, tu peux utiliser une autre méthode rarement utilisé, c'est l'opérateur ternaire.

Code PHP:


sDial
= ( nDial==1)? "Bonjour""Aurevoir"
Par contre je ne sais pas du tout si nwnscript le gère, je sais que le c le gère donc que peut être....
Oki jedaï, honte à moi, j'ai ta bibliothèque mais je n'ai jamais eu le temps de regarder ton code lol

Bon en tout cas, si ça marche c'est le plus rapide pour les tests simple
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés