Les variables
“GOD is real, unless declared integer.”
Dans ce document, les abréviations i.e. et e.g. sont utilisées par convénience. I.e. signifie “id est” se traduisant par “c'est-à-dire” et e.g. signifie “exempli gratia” se traduisant par “par exemple”.
Introduction
Dans la programmation, une variable est un conteneur. Elle porte un nom et sert à enregistrer un résultat, un message, etc. En SQF, une variable est affectée à une valeur avec le symbole =
, e.g. my_var = 2;
. Ici on affecte la variable de nom my_var
à la valeur 2
, si la variable n'existe pas déjà, le système la déclare (créée) automatiquement. Si dans la console arma je tape my_var + 1;
, elle me retourne la valeur 3
(incroyable, je sais ).
Une variable possède un type, i.e. une indication à votre machine de comment interpréter sa valeur (qui est une suite de 0 et 1 pour votre ordinateur). Dans mon exemple, ma variable my_var
est de type nombre et cela est déterminé automatiquement par le SQF. C'est ce qui a permit à la machine de faire l'addition my_var + 1;
. Assignons une nouvelle valeur d'un autre type à notre variable, my_var = “2”;
. Nous avons maintenant une chaine de caractère (ou String) qui permet de contenir du texte comme “Hello world”
(Cela fonctionne aussi avec de simple quote 'Hello world'
). Si on essaye d'additionner “2” + 1;
, on obtient une erreur car pour le système on essaye d'additionner un caractère avec un nombre.
1 + “1”
car se sont deux types différents. À l'inverse, C possède un typage statique faible. Si on fait 1 + “1”
, C fait une conversion implicite/interne pour réaliser l'addition (à noter que “a” + 1
vous retournera une erreur).
Types basiques
Ces types de variables sont communs à la majorité des langages de programmation (excepté le type nombre qui est un cas particulier), il désigne donc des concepts simples.
Number
Les variables de type Number sont fait pour contenir des… nombres !
Les opérateurs comme l'addition +, la soustraction -, la multiplication *, la division /, la puissance ^, se comportent comme en math, on peut utiliser des parenthèses pour changer l'ordre de ces opérations.
Cela est du au fait que dans la plupart des langages de programmation on fait la différence entre entiers et les nombres réels. La raison est simplement technique : un nombre entier peut toujours être représenté de manière exacte (avec suffisamment de mémoire). C'est très rarement le cas pour les nombres réels, pensez à PI ou simplement la division 1/3 (nombres infinis après la virgule). La mémoire de notre ordinateur étant limité, on est obligé de tronquer la valeur du réel jusqu'à une certaine précision. On a donc souvent un type int (pour integer) et float (pour virgule flottante, une représentation des nombres réels) dans d'autres langages.
Pourquoi je vous parle de cela ? Simplement que quand vous comparez deux nombres réels n'utilisez jamais l'égalité ==
car la représentation d'un nombre réel est très rarement exacte (et votre égalité peut ne jamais être vraie).
String
En français, la chaîne de caractère. Ce type permet de contenir du texte et sert à l'affichage de message que se soit dans la console, le chat, le log, etc, e.g. “Hello world!”
. On reconnait ce type car le texte est encadré par des apostrophes ou guillemets 'a'
ou a“”
(single ou double quotes en anglais). L'utilisation des guillemets permettant l'utilisation d'aspostrophe sans casser la chaine de caractère dans le message e.g. “Tanin, l'carnard boiteux”
.
Votre message peut être vide “”
.
Boolean
Le type booléen, dont son nom est une référence à George Boole (mathématicien), est une variable possédant la valeur vraie ou faux. Vous allez utiliser énormément se type de variable dans la structure de votre programme. Prenons un exemple simple :
Je compare 2 nombres et j'assigne le résultat à une variable : my_var = 20 < 40;
.
La réponse de cette comparaison est évidente, 20 étant inférieur à 40. Notre comparaison retourne donc la true (vrai en anglais) et notre conteneur my_var
est une variable de type bool (booleen) contenant cette valeur.
Si on tape l'inverse my_var = 20 > 40;
. Cette fois-ci notre valeur est false (faux en anglais).
Ce type est très utile pour contrôler le flux de votre programme (conditions et boucles).
Itérables
Le mot itérable veut simplement dire que l'on va pouvoir parcourir le contenu de cette variable, i.e. on itère dessus. De manière générale une variable itérable est une collection de valeur.
Array
Un array (tableau en français) est une collection ordonnée de valeur, i.e. que les valeurs sont toujours rangés dans le même ordre (sauf si le programmeur décide de changer l'ordre explicitement). Les valeurs à l'intérieur d'un array sont de n'importe quelle type (des nombres, strings, bool,… Et même d'autres arrays).
Voyons un exemple : my_array = [0, 1, “deux”, “3”, []];
.
Nous avons ici un array avec 5 valeurs à l'intérieur avec des types différents. Les deux premières valeurs sont de type nombre, les deux suivantes sont de type string. La dernière est simplement un autre array qui lui ne contient aucune valeur, on dit qu'il est vide (puisque c'est le cas) mais il existe bel et bien.
J'imagine que vous avez compris en voyant cet exemple qu'un array est symbolisé par des crochets [] et que les éléments à l'intérieur sont séparés par des virgules.
Hashmap
Un Hashmap est une structure de données dont le fonctionnement est similaire à un dictionnaire. Quand vous cherchez une définition dans un dictionnaire vous cherchez le mot-clef correspondant (ordonné alphabétiquement) dedans.
Dans un Hashmap chaque valeur que vous rentrez est lié à une clef définie par vous, les éléments sont donc des paires key/value et si vous l'avez compris, vous accéder à une valeur en appelant la clef au lieu d'un indice comme dans un array.
En SQF, il faut utiliser soit les commandes createHashMap ou createHashMapFromArray pour créer votre Hashmap.
Les commandes insert, set et deleteAt permettent d'en manipuler les éléments.
Pour aller plus loin
Fondamentalement un array et un Hashmap ont le même objectif, stocker d'autres variables/éléments. Néanmoins ils ne sont pas seulement différents en apparence mais également en terme de performances selon la tache, ainsi le choix d'utiliser l'une de ces structure est motivé par son utilisation.
E.g. un array est plus performant pour toutes opérations concernant l'ensemble des éléments, parcourir un array par une boucle étant plus rapide que pour un hashmap de même nombre d'éléments où l'on accède à chaque élément par la clef. À l'inverse, le temps d'accès à la valeur d'un seul élément pour un hashmap est constant quelque soit sa taille (grâce à l'utilisation d'une clef permettant d'accéder directement à la mémoire) tandis que ce dernier grandit en fonction du nombre d'éléments pour un array (le programme parcourt tous le tableau pour trouver le bon éléments.