> Tech > Le programme MultiDim

Le programme MultiDim

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

La figure 1 présente le source du module MultiDim. Une fois lié à  une application, ce programme permet à  cette dernière de manipuler facilement des tableaux multidimensionnels simulés (la figure 2 présente le membre Copy des prototypes utilisés dans ce module). J'expliquerai plus loin comment utiliser MultiDim dans les applications.

Le programme MultiDim

Dans un premier temps, étudions le programme de service en lui-même.

Même si MultiDim est un module NoMain, il définit certaines variables dans la partie principale du source (en A) avant la première procédure, afin d’étendre la visibilité de ces variables à  l’ensemble des procédures du module. Les champs GoodReturn et BadReturn représentent des constantes retournées par les procédures MultiDim pour en indiquer respectivement la réussite ou l’échec. Le champ TotNumElts est une constante nommée possédant une valeur de 10.

DscrptrPtrArr, dont la définition suit, représente un tableau de pointeurs vers des descripteurs de tableaux (structures décrivant les attributs de chaque tableau multidimensionnel). Ces structures sont détaillées un peu plus loin. DscrptrPtrArr étant défini comme possédant TotNumElts (10) éléments, on ne peut pas manipuler plus de 10 tableaux multidimensionnels en parallèle. Si un plus grand nombre de tableaux est nécessaire, il suffit de modifier la valeur de la constante nommée TotNumElts.

Pour finir, le champ CurrNumElts contient le nombre réel de tableaux simulés. MultiDim utilise ce champ pour assigner des identificateurs temporaires uniques, ou “ handles ” (poignées), pour les tableaux.

MultiDim nécessite un handle pour chaque tableau multidimensionnel. La procédure GetArrayHdl (dont l’instruction de départ se trouve en B) récupère un handle vers un tableau et doit être appelée pour chaque tableau avant la manipulation de celui-ci. Les définitions des paramètres GetArrayHdl sont illustrées en C. UsrDscrptrPtr représente un pointeur vers le descripteur du tableau du programme appelant et Hdl est le handle du tableau.

Chaque invocation de GetArrayHdl incrémente la valeur du champ CurrNumElts et assigne le résultat au handle du tableau, fournissant ainsi l’identificateur unique indispensable pour référencer le tableau. Outre la vérification d’un handle disponible, GetArrayHdl retourne le handle du tableau au programme appelant à  travers le paramètre Hdl et affecte la valeur du pointeur vers l’adresse du descripteur du tableau du programme appelant (D) au tableau DscrptrPtrArr.

La procédure GetArrayIdx (dont l’instruction de départ se trouve en E) constitue la véritable cheville ouvrière de MultiDim : elle calcule l’index unidimensionnel à  utiliser pour un jeu donné d’index multidimensionnels. Comme on peut le deviner, cette procédure est considérablement plus complexe que GetArrayHdl.

GetArrayIdx utilise les paramètres définis en F. Elle calcule l’index du tableau unidimensionnel et retourne le résultat dans le paramètre Idx. En plus du handle du tableau (Hdl), la procédure accepte en entrée jusqu’à  10 valeurs d’index multidimensionnels. Cette limite de 10 dimensions en ce qui concerne les tableaux est raisonnable pour la plupart des applications professionnelles.

La procédure utilise le handle comme index sur DscrptrPtrArr, le tableau de descripteurs de tableau. On se souviendra que les éléments de DscrptrPtrArr représentent des pointeurs vers des descripteurs de tableaux. En G, notez que je définis UsrDscrptrArr comme étant un tableau vers lequel pointe le pointeur UdaPtr. Ce tableau correspond au tableau de descripteurs de l’application. Comme toutes les variables pointées, il n’occupe pas d’emplacement précis en mémoire. En fait, il s’agit d’une définition qui peut être placée n’importe où en mémoire en positionnant son pointeur (UdaPtr). Le champ des handles (Hdl) indique la valeur à  utiliser pour UdaPtr parmi les 10 valeurs possibles du pointeur. Ainsi, DscrptrPtrArr(Hdl) contient la valeur à  utiliser pour UdaPtr. L’instruction Eval en I affecte cette valeur à  UdaPtr.

La procédure GetArrayIdx valide en premier lieu les paramètres qui lui sont passés en exécutant la sous-routine ValParms (K). Notez que cette sous-routine exécute la sous-routine FilIndxArr (L) pour compléter le tableau d’index nommé IndxArr (défini en H). FilIndxArr utilise le résultat de la fonction intégrée %Parms pour rechercher le nombre de paramètres et place ensuite les valeurs concernant la taille passées comme paramètres dans le tableau IndxArr.

La procédure GetArrayIdx effectue les principaux calculs afin de déterminer l’index linéaire (véritable) en J. Une discussion sur l’équation polynomiale mise en oeuvre ici dépasse le cadre de cet article ; je puis cependant garantir que l’équation fonctionne ! (pour de plus amples informations sur la formule qui sert de base à  cette équation, consultez l’article “ Multidimesionnal Arrays : the Basics ”).

Je suis conscient de la complexité du code du programme de service MultiDim. Aussi, voyons à  présent un code plus facile à  comprendre : celui de l’application utilisant MultiDim.

Téléchargez cette ressource

Guide des solutions de cloud & services managés simplifiés

Guide des solutions de cloud & services managés simplifiés

A la fois cloud provider et ESN, le groupe ACESI s’appuie sur les technologies VMware pour apporter toute la richesse du cloud dans des environnements hybrides. Découvrez, dans ce guide thématique, les bonnes pratiques pour répondre aux défis de simplification du Cloud.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010