21 octobre 2008

Cours d'initiation au langage LSL (V)

Bien, le cours du jour concernera le type de données string.
Il sera l'avant dernier cours à présenter les éléments de base du langage LSL, le dernier sera consacré au type list. Les prochains cours seront tous construits sur le même modèle : nous commencerons à étudier les évènements. Pour cela, explication sera donnée de l'évènement et de sa capture. Puis, je vous proposerai un petit script : cahier des charges de ce qu'il doit faire, le script, et l'explication des différentes parties du script.

Mais commençons par le commencement... le type string !



I - STRING : les chaines de caractères

Une chaine de caractères se repère très vite car elle est délimitée par des guillemets....
Dans l'exemple qui suit, "Bonjour à tous" est une chaine de caractères affectée à la variable msg.

string msg;
msg = "bonjour à tous";


L'opération la plus utilisée sur les chaine de caractères, est la concaténation : il s'agit de regrouper , de coller des chaines de caractères pour n'en former plus qu'une seule.

msg = "Bonjour " + "à tous";

Que l'on écrive : "Bonjour à tous" ou "Bonjour " + "à tous" cela revient à la même chose.
La concaténation de chaines se fait grâce à l'opérateur +


string msg1, msg2, msg;
msg1 = "Kikooooo";
msg2 = "les amis !!";

msg = msg1 + msg2;


Que vaut msg ?? il est la concaténation de msg1 et msg2, soit : Kikoooooles amis !! On remarque qu'il y a un problème d'espacement, ce qui est normal, vu que msg1 et msg2 ne contiennent pas d'espace. Pour que le message soit correct, je dois ajouter un espace entre msg1 et msg2...
Ce qui nous donne :

msg = msg1 + " " + msg2;

Et là, ca marche !!
Les guillemets sont les délimiteurs de la chaine... mais alors, comment faire si je veux une chaine de caractères qui contienne des guillemets ?? Il faudra pour cela utiliser le caractère d'échappement \, qui despécialisera les guillemets :

msg = "Comment ca \"lapin\" ?? ";

La chaine msg, si on l'affiche donnera : Comment ca "lapin" ??
Voici les caractères d'échappement du LSL :

\t tabulation
\n passage à la ligne
\" "
\\ \



Quelques fonctions sur les chaines......



llStringLength compte le nombre de caractères d'une chaine

string msg = "Youppi c'est les vacances !!";
llWhisper(PUBLIC_CHANNEL, msg + " contient exactement " + (string)llStringLength(msg) + " caractères...");


Nous lirons sur le chat : Youppi c'est les vacances !! contient exactement 28 caractères...
Une petite remarque.... que viens faire ici (string) ??
La fonction llStringLength renvoie un nombre entier.... or, un nombre n'est pas une chaine de caractères.... Je dois donc convertir l'entier en string par l'opération de cast (cf un des précédent cours...). Ici je caste en string donc : (string).
Il s'agit la d'une erreur fréquente... le compilateur refuse de faire son travail et nous donne une erreur dans le message que l'on veut écrire sur le chat..... bien souvent, c'est parce que la chaine que l'on veut écrire, contient un morceau qui n'est pas du type string... L'ajout du cast (string) résoud bien souvent le problème.



llGetSubString permet d'extraire d'une chaine une sous chaine.
Prototype de la fonction : string llGetSubString(string msg, integer debut, integer fin)
Par exemple : dans l'exemple suivant, on va extraire juste le mot "les"..... (le mot "les", pas le mot laid, ou le Molay, car pour ce dernier, c'est impossible depuis 1314... hihi)

string msg = "Youppi c'est les vacances !!";
msg = llGetSubString( msg, 13, 15 );
llSay(PUBLIC_CHANNEL, msg);


La première lettre de la chaine est indicée 0...... donc je prends les caractères en commençant au caractère d'index 13 et termine au 15 inclus...



llSubStringIndex permet de savoir si une chaine donnée est incluse dans une plus grande.. et si oui à quel endroit....
Elle renvoie donc un entier correspondant à l'index de la sous chaine, et elle renvoie -1 si elle ne trouve pas.
Prototype : integer llSubStringIndex(string msg, string sous_chaine);

Exemple : ma chaine contient-elle le mot Ouma ??

string msg = "Mais qui vois je la bas ?? Serait ce mon amie Ouma ??
integer idx = llSubStringIndex(msg, "Ouma");
if (idx == -1) llSay(PUBLIC_CHANNEL, "Ouma n'est pas la !!");
else llSay(PUBLIC_CHANNEL, "Ouma est la !!");


Si j'exécute ce code..... je peux lire dans le chat : Ouma est la !! hihi.... J'aime faire participer, à leur insu, mes amies à mes cours !!


Autre exemple d'application de cette fonction : beaucoup d'objets fonctionnent avec une notecard qui contient des informations pour paramétrer l'objet. En général, on note des informations sur une ligne, et chaque ligne contient ainsi plusieurs paquets de paramètres.
Illustrons cela par un exemple : nous ne verrons pas ici la lecture de la notecard, mais seulement le traitement de la ligne....
Ma notecard contient un nom d'avatar puis un point virgule, puis un nombre. Et ainsi de suite sur chaque ligne....

par exemple :
Deirdre;25
Yoyo; 27
Ouma;32
Lala; 36
Nounours;34




Dans mon script, je récupère une ligne de cette notecard dans une variable ligne. Je veux ensuite affecter le nom à la variable nom, et le nombre à la variable nombre....... Pour cela, je vais agir de la manière suivante : créer deux sous chaines : de 0 à index de ";" et de index de ";" à fin.... Mon pivot est donc l'adresse du ";".

string ligne = "Deirdre;25";
string nom;
string nombre;

nom = llGetSubString(ligne, 0, llSubStringIndex(ligne, ";")-1);
nombre = llGetSubString(ligne, llSubStringIndex(ligne, ";") + 1, llStringLength(ligne));

llSay(PUBLIC_CHANNEL, nom + " a pour nmbre : " + (string)nombre);



Pour le nom, llSubStringIndex(ligne, ";") me donne l'index du ";". Or je ne veux pas de lui dans le nom... d'où le -1 qui recule l'indice....
De même, pour le nombre, je me place apres l'index pour commencer à le lire....
Remarquez aussi que je vais jusque llStringLength(ligne), qui correspond a la longueur de ma chaine. J'aurais pu aussi écrire :

nombre = llGetSubString(ligne, llSubStringIndex(ligne, ";") + 1, -1);

Ici, -1 signifie : le dernier caractère de la chaine. Cette version est préférable, car elle evite l'appel à une nouvelle fonction, et rendre le code plus aisé à lire, à partir du moment où on sait ce que ce -1 veut dire bien sur.


Il existe d'autres fonctions concenrant le traitement des string. Je n'en ai présenté ici que quelques unes, pour donner une idée de leur utilisation.
C'est tout pour aujourd'hui.

Aucun commentaire: