%MINARR
Position du plus petit élément
Renvoie la position (et non la valeur) de l'élément le plus petit d'un tableau, éventuellement sur une plage d'éléments.
Syntaxe
%MINARR(tableau {: départ {: nombre}})
tableau- Le tableau à examiner : numérique, texte ou date. On ne peut pas y passer
%subarr. départ- Position du premier élément examiné (1 par défaut).
nombre- Nombre d'éléments examinés à partir de
départ(jusqu'à la fin du tableau par défaut). - Résultat
- Un entier : la position de l'élément le plus petit, comptée dans le tableau entier même si on limite la plage. S'il y a des ex aequo, c'est le premier.
À quoi ça sert
Chercher la plus petite valeur d'un tableau et retrouver, au même indice, les données associées : le client le plus endetté, la date la plus ancienne, le tarif le moins cher. %min compare quelques valeurs ; %minarr parcourt tout un tableau.
Exemple 1 : Le plus petit solde
**free
// %MINARR : position de l'element le plus petit d'un tableau.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s nom char(20) dim(5);
dcl-s solde packed(9:2) dim(5);
dcl-s pos int(10);
nom(1) = 'Dupont SA';
solde(1) = 1250.50;
nom(2) = 'Martin et fils';
solde(2) = 0;
nom(3) = 'Leroy SARL';
solde(3) = -320.00;
nom(4) = 'Bernard Transports';
solde(4) = 98000.00;
nom(5) = 'Petit Atelier';
solde(5) = 45.10;
pos = %minarr(solde);
snd-msg 'Position du plus petit solde : ' + %char(pos);
snd-msg 'Client : ' + %trim(nom(pos)) + ', solde ' + %char(solde(pos));
// Le plus petit solde parmi les clients 4 et 5 : la position est celle du tableau entier.
pos = %minarr(solde : 4 : 2);
snd-msg 'Plus petit entre 4 et 5 : ' + %char(pos);
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Position du plus petit solde : 3
Client : Leroy SARL, solde -320.00
Plus petit entre 4 et 5 : 5
%minarr(solde) renvoie 3, la position de -320,00, et nom(pos) donne le client correspondant. Avec un départ à 4 sur 2 éléments, le plus petit des soldes 4 et 5 est en position 5 : la position est comptée dans le tableau entier.
Exemple 2 : Éléments inutilisés
**free
// %MINARR : les elements inutilises comptent, ils valent 0.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s solde packed(9:2) dim(6);
dcl-s nb int(10) inz(3);
dcl-s pos int(10);
// 3 soldes seulement sur 6 elements.
solde(1) = 1250.50;
solde(2) = 98000.00;
solde(3) = 45.10;
pos = %minarr(solde);
snd-msg 'Tout le tableau : element ' + %char(pos) + ', valeur ' + %char(solde(pos));
// On limite la recherche aux elements remplis.
pos = %minarr(solde : 1 : nb);
snd-msg 'Elements 1 a 3 (nb) : element ' + %char(pos) + ', valeur ' + %char(solde(pos));
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Tout le tableau : element 4, valeur .00
Elements 1 a 3 (nb) : element 3, valeur 45.10
Trois soldes sont remplis sur six. Sur tout le tableau, le plus petit est 0,00, en position 4 : c'est le premier élément inutilisé. En passant le nombre d'éléments remplis (nb), on obtient bien la position 3 (45,10).
Le piège
Les éléments inutilisés valent 0 et gagnent presque toujours. Dans un tableau numérique à moitié rempli, le plus petit élément est un des éléments vides, comme le montre le second exemple (position 4, valeur 0,00) : le résultat n'a rien à voir avec les données.
Il faut limiter la recherche aux éléments utiles avec départ et nombre, ou utiliser un tableau dim(*auto), qui ne contient que ce qu'on y a ajouté.