Les tableaux – Part 3

Après avoir lu la partie 2, tu dois savoir un minimun utiliser les tableaux. Nous allons maintenant plus loin et voir comment copier réellement les tableaux.

Sous Arma, les variables contenant des tableaux, ne contiennent en réalité par les données du tableau mais une référence vers le tableau. Une référence est l’équivalent d’un alias qui pointe sur la donnée.

Sur cette base, si t’assignes une référence à une variable, et qu’ensuite tu assignes la valeur de cette variable à une autre variable. Les 2 variables seront définies avec la même référence et pointeront sur le même tableau.

Modifier la valeur du tableau en utilisant une variable, aura donc le même effet sur la deuxième variable, car elles pointeront toutes les deux vers la même donnée.

Mais ça n’est pas tout, car les références fonctionnent également lorsque la variable contenant la référence du tableau est passée en paramètre d’une fonction.

Par exemple, si tu passes le tableau1 en paramètre d’une fonction, et que tu l’assignes à tableau2 à l’intérieur de la fonction. Toutes les modifications sur tableau2 à l’intérieur de la fonction seront répercutées sur tableau1.

_tableau1 = [1,2,3];

_tableau2 = _tableau1;
_tableau2 set [2,0];
//_tableau1 est [1,2,0]

a = {
    private ["_tableau2"];
    _tableau2 = _this;
    _tableau2 set [2,10];
};
_tableau1 call a;
//_tableau1 is now [1,2,10]

Cet utilisation des références sous Arma n’existe qu’avec le type tableau. Les autres types primitifs (string, scalar, ..) n’utilisent pas les références. Ce qui parfois donne des comportements déroutants et demande une gymnastique de l’esprit assez aiguisée ! Les types primitifs en ce sens sont beaucoup moins intéressant que le tableau.

Débrayer les références
Il est possible de débrayer ce comportement(ce qui devrait être rarement nécessaire), et de ne pas utiliser les références avec les tableaux, il faut alors utiliser l’opérateur +

tableau1 =+ tableau2;

Cette commande aura pour effet de créer une copie complète, et de dissocier le tableau1 du tableau2.

Rappelle toi que le fonctionnement par référence est une bonne chose, c’est un vecteur majeur d’optimisation!

_tableau1 = [1,2,3];

_tableau2 = [] + _tableau1;
//_tableau2 est [1,2,3]

_tableau2 set [2,0];
//_tableau1 is still [1,2,3], _tableau2 est [1,2,0]

_tableau2 = _tableau1 + [];
//_tableau2 est [1,2,3]

_tableau2 set [2,10];
//_tableau1 is still [1,2,3], _tableau2 est [1,2,10]

_tableau2 = _tableau1 - [];
//_tableau2 est [1,2,3]

_tableau2 set [2,20];
//_tableau1 is still [1,2,3], _tableau2 est [1,2,20]

_tableau2 = +_tableau1;
//_tableau2 est [1,2,3]

_tableau2 set [2,30];
//_tableau1 is still [1,2,3], _tableau2 est [1,2,30]

Pour changer la valeur d’un élément dans un tableau imbriqué, il suffit de suivre les éléments de façon hiérarchique. Une fois l’élément atteint, définir sa valeur comme désiré !

tableau = [[1,2,3],[4,5,6],[7,8,[9,10]]];

((tableau select 2) select 2) set [0,10];
//tableau is now [[1,2,3],[4,5,6],[7,8,[10,10]]]

Pour itérer sur un tableau à une seule dimension, tu peux utiliser la commande foreach. Cette commande parcoure le tableau élément après élément, comme le fait la commande count (part 1).

La variable spéciale _x contient l’élément courant de l’itération, et la variable spéciale _forEachIndex contient l’index de l’élément dans le tableau , si t’en as besoin.

_tableau = ["John","Paul","George","Ringo","John","Paul","George","Ringo"];
_index = -1;
{
    if (_x isEqualTo "George") then {
        _index = _forEachIndex;
    };  
} forEach _tableau;
//_index est 6

Pour récupérer de façon un élément aléatoire dans un tableau, tu dois utiliser selectRandom qui est désormais devenu une commande native bien plus efficace que tout les solutions de contournement qu’on peut trouver sur le net.

_resultat = selectRandom ["green", "yellow", "purple", "white"];

Cet article a été initialement rédigé par Killzone Kid, réactualisé par Code34

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s