Aller au contenu

%MAXARR

Position du plus grand élément

Renvoie la position (et non la valeur) de l'élément le plus grand d'un tableau, éventuellement sur une plage d'éléments.

Syntaxe

%MAXARR(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 grand, comptée dans le tableau entier même si on limite la plage. S'il y a des ex aequo, c'est le premier. Pour un tableau dim(*auto) sans élément, le résultat est 0.

À quoi ça sert

Trouver le meilleur client, le mois le plus chargé, la plus grande facture : avec la position, on retrouve aussi les autres tableaux parallèles (le nom du client, le libellé du mois) au même indice, ce que la simple valeur ne permettrait pas. %max est fait pour comparer quelques valeurs ; %maxarr parcourt tout un tableau.

Exemple 1 : Le plus gros solde

**free
// %MAXARR : position de l'element le plus grand 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 = %maxarr(solde);
snd-msg 'Position du plus gros solde : ' + %char(pos);
snd-msg 'Client : ' + %trim(nom(pos)) + ', solde ' + %char(solde(pos));

// Sur un tableau de texte, l'ordre est celui de l'EBCDIC.
pos = %maxarr(nom);
snd-msg 'Dernier nom dans l''ordre : ' + %trim(nom(pos));

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Position du plus gros solde : 4
Client : Bernard Transports, solde 98000.00
Dernier nom dans l'ordre : Petit Atelier

Deux tableaux parallèles portent les noms et les soldes. %maxarr(solde) renvoie 4, la position de 98 000,00 ; on en déduit le nom avec nom(pos). Sur un tableau de texte, l'ordre est celui de l'EBCDIC : ici « Petit Atelier » est le plus grand.

Exemple 2 : Ex aequo, plage et tableau vide

**free
// %MAXARR : ex aequo, plage de recherche et tableau vide.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s ca packed(9:2) dim(6);
dcl-s vide packed(9:2) dim(*auto : 6);

ca(1) = 1250.50;
ca(2) = 98000.00;
ca(3) = 45.10;
ca(4) = 98000.00;
ca(5) = 320.00;
ca(6) = 7800.00;

// Deux mois au meme maximum : on obtient le premier.
snd-msg 'Maximum (ex aequo)    : ' + %char(%maxarr(ca));

// Recherche a partir de l'element 3, sur 4 elements : la position reste celle du tableau entier.
snd-msg 'Maximum de 3 a 6      : ' + %char(%maxarr(ca : 3 : 4));
snd-msg 'Maximum de 5 a 6      : ' + %char(%maxarr(ca : 5 : 2));

// Tableau dim(*auto) sans element : 0.
snd-msg 'Tableau vide          : ' + %char(%maxarr(vide));

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Maximum (ex aequo)    : 2
Maximum de 3 a 6      : 4
Maximum de 5 a 6      : 6
Tableau vide          : 0

98 000,00 apparaît aux positions 2 et 4 : on obtient 2. Avec un départ à 3 sur 4 éléments, on obtient 4, la position dans le tableau entier et non dans la plage. Le tableau dim(*auto) vide donne 0.

Le piège

On reçoit une position, pas une valeur. Le premier exemple affiche 4, pas 98 000,00 : pour la valeur, on écrit solde(%maxarr(solde)). Avec un tableau vide, la position 0 n'est pas un indice valide : le tester avant de lire l'élément.

Deux détails de la plage : elle est comptée dans le tableau entier (le résultat pour « de 3 à 6 » est 4, pas 2), et en cas d'ex aequo seul le premier est renvoyé.