meta données pour cette page
  •  

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
arma:createurs_de_missions:arma_3:tips_en_tout_genre:fonctions [2026/10/15 23:28] – Restauration de l’ancien wiki (arma:createurs_de_missions:arma_3:tips_en_tout_genre:fonctions, archive.org) tanin_claudearma:createurs_de_missions:arma_3:tips_en_tout_genre:fonctions [2026/10/16 00:36] (Version actuelle) – Mention de jeu retirée du titre (rubrique déjà séparée par jeu) tanin_claude
Ligne 3: Ligne 3:
 ===== Qu'est-ce ? ===== ===== Qu'est-ce ? =====
  
-En programmation, il arrive très souvent que l'on répète une tache identique ou semblable à divers endroits de notre code. //E.g.// calculer le carré d'un nombre ou, autre exemple, dans arma récupérer le joueur le plus proche d'une position (aucune commande arma pour cela). On est donc obligé de construire notre propre algorithme pour le faire. Une fois construit il serait pratique de pouvoir, au lieu de le copier coller partout, l'appeler sous un mot-clef comme une commande. L'avantage est que si on a une erreur dans l'agorithme il n'y a pas besoin de la corriger dans tous les endroits où l'on exécute notre code, seulement à l'endroit où on le définit.+En programmation, il arrive très souvent que l'on répète une tâche identique ou semblable à divers endroits de notre code. //E.g.// calculer le carré d'un nombre ou, autre exemple, dans Arma récupérer le joueur le plus proche d'une position (aucune commande Arma pour cela). On est donc obligé de construire notre propre algorithme pour le faire. Une fois construit, il serait pratique de pouvoir, au lieu de le copier-coller partout, l'appeler sous un mot-clef comme une commande. L'avantage est que si on a une erreur dans l'algorithme il n'y a pas besoin de la corriger dans tous les endroits où l'on exécute notre code, seulement à l'endroit où on le définit.
  
-Une telle structure syntaxique porte un nom, c'est la**fonction**. Son appellation vient tout simplement de l'objet mathématique du même nom.+Une telle structure syntaxique porte un nom, c'est la **fonction**. Son appellation vient tout simplement de l'objet mathématique du même nom.
  
-<note>Petit rappel de math. Une fonction peut prendre une ou plusieurs variables et retourne une valeur. //E.g.// prenons une fonction noté //f// qui prend plusieurs variables //x_1, x_2, x_3, etc// et qui retourne une valeur. Pour appeler notre fonction on utilise la syntaxe //f(x_1, x_2, x_3, etc)//. En informatique, c'est pareil. Ainsi on peut créer une fonction ''%%maSuperbeFonction%%'' peut prendre les paramètres ''%%monPremierMagnifiqueParamètre, monDeuxièmeMagnifiqueParamètre, etc%%'' et retourne ''%%maBrillantissimeValeur%%''.</note>+<note>Petit rappel de math. Une fonction peut prendre une ou plusieurs variables et retourne une valeur. //E.g.// prenons une fonction notée //f// qui prend plusieurs variables //x_1, x_2, x_3, etc// et qui retourne une valeur. Pour appeler notre fonction on utilise la syntaxe //f(x_1, x_2, x_3, etc)//. En informatique, c'est pareil. Ainsi on peut créer une fonction ''%%maSuperbeFonction%%'' qui prend les paramètres ''%%monPremierMagnifiqueParamètre, monDeuxièmeMagnifiqueParamètre, etc%%'' et retourne ''%%maBrillantissimeValeur%%''.</note>
  
-Le principe est donc clair, vous écrivez **une seule fois** le code de votre fonction en définissant les paramètres attendus ainsi que la valeur retournée. Ensuite il ne vous reste plus qu'appeler là où vous le voulez dans votre code en écrivant ''%%maSuperbeFonction(…)%%'' (Dans un language bien écrit, hein Bohémia avec ton SQF).+Le principe est donc clair, vous écrivez **une seule fois** le code de votre fonction en définissant les paramètres attendus ainsi que la valeur retournée. Ensuite il ne vous reste plus qu'à l'appeler là où vous le voulez dans votre code en écrivant ''%%maSuperbeFonction(…)%%'' (dans un langage bien écrit, hein Bohemia avec ton SQF).
  
 ===== En SQF ===== ===== En SQF =====
  
-Si vous êtes ici c'est bien parce que vous voulez faire du scripting SQF qui supporte bien heureusement les fonctions. Il vaut mieux pour un langage s'appellant “**S**tatus **Q**uo **F**unction”…+Si vous êtes ici, c'est bien parce que vous voulez faire du scripting SQF qui supporte bien heureusement les fonctions. Il vaut mieux pour un langage s'appelant “**S**tatus **Q**uo **F**unction”…
  
 ---- ----
Ligne 25: Ligne 25:
  
   - La syntaxe pour les paramètres est identique dans les deux cas ainsi que pour la valeur de retour.   - La syntaxe pour les paramètres est identique dans les deux cas ainsi que pour la valeur de retour.
-  - Il suffit de suivre la recette de cuisine pour pas se tromper pour déclarer ces paramètres. (Bon ça c'est commun à tous les langages).+  - Il suffit de suivre la recette de cuisine pour ne pas se tromper en déclarant ces paramètres. (Bon ça c'est commun à tous les langages).
  
-Le point négatif est que le SQF a décidé de ne pas suivre une syntaxe conventionnel (parce que Bohémia) pour les fonctions si l'on compare le SQF à celle des langages de programmation répandus, même ancien. Toutefois pas d'inquiétude, c'est abordable.+Le point négatif est que le SQF a décidé de ne pas suivre une syntaxe conventionnelle (parce que Bohemia) pour les fonctions si l'on compare le SQF à celle des langages de programmation répandus, même anciens. Toutefois, pas d'inquiétude, c'est abordable.
  
 ==== Construire une fonction ==== ==== Construire une fonction ====
Ligne 33: Ligne 33:
 === Création et exécution === === Création et exécution ===
  
-Une fonction en SQF c'est finalement comme n'importe qu'elle autre variable qui contiendrait du texte ou un nombre, sauf que cette fois-ci elle contient du code. La question qui se soulève est donc, comment je créer une variable de type code en SQF. La réponse est très simple, il suffit d'utiliser des accolades comme suit ''%%monCode = {};%%''.\\+Une fonction en SQF c'est finalement comme n'importe quelle autre variable qui contiendrait du texte ou un nombre, sauf que cette fois-ci elle contient du code. La question qui se soulève est donc, comment créer une variable de type code en SQF. La réponse est très simple, il suffit d'utiliser des accolades comme suit ''%%monCode = {};%%''.\\
 Ici je viens de créer une variable ''%%monCode%%'' qui contient un code vide (et qui ne fait donc rien). Ici je viens de créer une variable ''%%monCode%%'' qui contient un code vide (et qui ne fait donc rien).
  
Ligne 59: Ligne 59:
 </code> </code>
  
-Si vous exécutez ces lignes dans la console de débug, vous devez avoir le message dans le chat du jeu.+Si vous exécutez ces lignes dans la console de débogage, vous devez avoir le message dans le chat du jeu.
  
 === Paramètres === === Paramètres ===
  
-La puissance des fonctions vient principalement de leur paramétrisation. Prenons l'exemple d'une fonction que l'on appelle //carre// et qui calcul le carré du chiffre 3.+La puissance des fonctions vient principalement de leur paramétrisation. Prenons l'exemple d'une fonction que l'on appelle //carre// et qui calcule le carré du chiffre 3.
  
 <code> <code>
Ligne 77: Ligne 77:
 </code> </code>
  
-j'obtient dans le chat : Le carré de 3 est 9\\ +j'obtiens dans le chat : Le carré de 3 est 9\\ 
-Cette fonction est peu pratique car si on veut calculer le carré d'un autre nombre il nous faut réécrire une autre fonction différente et on pert tout l'avantage des fonctions. Heureusement on peut paramétriser nos fonctions.+Cette fonction est peu pratique car si on veut calculer le carré d'un autre nombre il nous faut réécrire une autre fonction différente et on perd tout l'avantage des fonctions. Heureusement on peut paramétriser nos fonctions.
  
-Pour passer un paramètre à une fonction on l'ajouter devant l'appel de la fonction. Avec notre exemple ça donne :+Pour passer un paramètre à une fonction on l'ajoute devant l'appel de la fonction. Avec notre exemple ça donne :
  
 <code> <code>
Ligne 86: Ligne 86:
 </code> </code>
  
-Maintenant comment utilise t'on ce paramètre ? C'est là où on rentre dans les spécifications bizarre du SQF. Le paramètre passé va être contenu dans une variable magique appelé ''%%_this%%''.+Maintenant, comment utilise-t-on ce paramètre ? C'est là qu'on entre dans les spécificités bizarres du SQF. Le paramètre passé va être contenu dans une variable magique appelée ''%%_this%%''.
  
-<note>**Variable magiques** : en programmation on appelle [[https://community.bistudio.com/wiki/Magic_Variables|variable magique]], une variable spéciale créée par le langage lui-même sans que l'utilisateur le fasse. En fait c'est une variable habituelle mais réservée par le langage, //i.e.// on peut lire cette variable mais il ne faut pas changer sa valeur et s'en servir comme n'importe qu'elle autre variable sous peine de maux de tête interminables sur des bugs pourris.</note>+<note>**Variables magiques** : en programmation on appelle [[https://community.bistudio.com/wiki/Magic_Variables|variable magique]], une variable spéciale créée par le langage lui-même sans que l'utilisateur le fasse. En fait c'est une variable habituelle mais réservée par le langage, //i.e.// on peut lire cette variable mais il ne faut pas changer sa valeur et s'en servir comme n'importe quelle autre variable sous peine de maux de tête interminables sur des bugs pourris.</note>
  
 On réécrit le code de notre fonction comme ceci On réécrit le code de notre fonction comme ceci
Ligne 100: Ligne 100:
 où l'on a remplacé la valeur 3 par ''%%_this%%''. Maintenant on peut utiliser notre fonction pour afficher le carré de n'importe quel nombre. où l'on a remplacé la valeur 3 par ''%%_this%%''. Maintenant on peut utiliser notre fonction pour afficher le carré de n'importe quel nombre.
  
-Comment passe t'on plusieurs paramètres ?\\+Comment passe-t-on plusieurs paramètres ?\\
 Eh bien en SQF, on ne peut pas mais c'est contournable. Tout d'abord l'astuce est de regrouper tous vos paramètres dans un [[https://community.bistudio.com/wiki/Array|''%%array%%'']] (tableau en français) et c'est ce tableau que l'on va passer comme dans l'exemple ci-dessous. Eh bien en SQF, on ne peut pas mais c'est contournable. Tout d'abord l'astuce est de regrouper tous vos paramètres dans un [[https://community.bistudio.com/wiki/Array|''%%array%%'']] (tableau en français) et c'est ce tableau que l'on va passer comme dans l'exemple ci-dessous.
  
Ligne 117: Ligne 117:
 </code> </code>
  
-Toutefois Bohémia a créé une commande spécial pour cette situation et avoir une syntaxe plus compréhensible qui est [[https://community.bistudio.com/wiki/params|''%%params%%'']]. Cela permet de réécrire notre fonction comme+Toutefois, Bohemia a créé une commande spéciale pour cette situation et avoir une syntaxe plus compréhensible qui est [[https://community.bistudio.com/wiki/params|''%%params%%'']]. Cela permet de réécrire notre fonction comme
  
 <code> <code>
Ligne 144: Ligne 144:
 </code> </code>
  
-Pour la fonction //carre//, la dernière opération est notre paramètre multiplié par lui-même (donc son carré) et pour la fonction //multiplication// c'est ''%%_x*_y%%''. Le point virgule n'est pas obligatoire et la convention est de ne pas le mettre pour spécifié à l'utilisateur que c'est bien la sortie voulue.+Pour la fonction //carre//, la dernière opération est notre paramètre multiplié par lui-même (donc son carré) et pour la fonction //multiplication// c'est ''%%_x*_y%%''. Le point-virgule n'est pas obligatoire et la convention est de ne pas le mettre pour signaler à l'utilisateur que c'est bien la sortie voulue.
  
 Par comparaison voici dans deux autres langages l'implémentation de ces deux fonctions (avec des commentaires) :\\ Par comparaison voici dans deux autres langages l'implémentation de ces deux fonctions (avec des commentaires) :\\
Ligne 211: Ligne 211:
 Il est possible de définir vos fonctions dans des fichiers séparés avec une fonction par fichier. Dans ce cas précis il ne faut pas utiliser d'accolades, le fichier remplissant leur fonction à la place. En fait tout script SQF peut être considéré comme une fonction non paramétrée (comme notre toute première version de la fonction //carre//). Il est possible de définir vos fonctions dans des fichiers séparés avec une fonction par fichier. Dans ce cas précis il ne faut pas utiliser d'accolades, le fichier remplissant leur fonction à la place. En fait tout script SQF peut être considéré comme une fonction non paramétrée (comme notre toute première version de la fonction //carre//).
  
-Ainsi il suffit de copier coller le contenu de vos accolades dans un fichier. Pour pouvoir l'utiliser ailleurs, il suffit de la compiler à l'aide des deux commandes suivantes [[https://community.bistudio.com/wiki/preprocessFile|preprocessFile]] et [[https://community.bistudio.com/wiki/compile|compile]] comme dans l'exemple suivant+Ainsi, il suffit de copier-coller le contenu de vos accolades dans un fichier. Pour pouvoir l'utiliser ailleurs, il suffit de la compiler à l'aide des deux commandes suivantes [[https://community.bistudio.com/wiki/preprocessFile|preprocessFile]] et [[https://community.bistudio.com/wiki/compile|compile]] comme dans l'exemple suivant
  
 <code> <code>