Micro Systèmes n°98 juin 1989
Micro Systèmes n°98 juin 1989
  • Prix facial : 30 F

  • Parution : n°98 de juin 1989

  • Périodicité : mensuel

  • Editeur : Société Parisienne d'Edition

  • Format : (203 x 271) mm

  • Nombre de pages : 188

  • Taille du fichier PDF : 153 Mo

  • Dans ce numéro : choisir... logiciels intégrés.

  • Prix de vente (PDF) : gratuit

Dans ce numéro...
< Pages précédentes
Pages : 154 - 155  |  Aller à la page   OK
Pages suivantes >
154 155
TECHNIQUF Algorithmes On suppose qu'on peut définir une référence strictement supérieure à toutes celles du catalogue (Référence_Bidon + bo) permettant de traiter une commande artificielle (Commande-Nulle) lors de la rencontre de la fin d'un fichier. La valeur + ce de la référence correspondante assure l'abandon des lectures dans ce fichier puisque le coprogramme Sélection choisit toujours le fichier dont la référence de la commande courante est la plus petite (voir algorithme). Programme Maître : Ouvrir les fichiers Créer les coprogrammes Activer Sélection Fermer les fichiers Coprogramme Lecture (donnée Fichier : T_Fichier_Entrée ; résultat Commande : T_Commande) I lit la commande suivante dans le fichier sélectionné si c'est possible, sinon retourne la commande nulle 1 répéter à l'infini Commande > - si fin de_fichier (Fichier) alors Commande_Nulle sinon Commande suivante dans Fichier activer Selection Coprogramme Sélection Décide dans quel fichier lire d'après la valeur des références, active convenablement le coprogramme de lecture, active le coprogramme de totalisation puis, lorsque tous les fichiers en entrée sont épuisés, rend la main au programme maître. Ce coprogramme est donc responsable de la synchronisation de l'ensemble 1 variables Commande-i : T_Commande (1 i nombre représentants) ces variables correspondent aux dernières commandes lues dans chacun des fichiers Fichier_i (un par représentant) ; elles conservent leur valeur entre deux activations du coprogramme (on dit qu'elles sont rémanentes) 1 I On fait une première lecture dans chaque fichier en entrée 1 pour tout i (1 i s nombre représentants) activer Lecture Fichier_i, Commande_i) I Puis on progresse en parallèle dans les fichiers jusqu'à épuisement de toutes les commandes ; on choisit lors de chaque lecture de progresser dans le fichier dont la référence courante est la plus petite, ce qui permet de couvrir toutes les commandes associées à la même référence avant de passer à une référence plus élevée 1 tant que l'une des Commande_i est non nulle, répéter I Il reste des commandes à traiter dans l'un au moins des Fichier_i 1 i > - indice de la Commande_i ayant la plus petite référence activer Totalisation(Commande_i) activer Lecture(Fichier_i,Commande_i) I On a épuisé tous les fichiers, on force la terminaison du dernier cumulde commande en provoquant un changement de référence et on rend la main au programme maître 1 activer Totalisation(Commande_i) activer Programme_Maître Coprogramme Totalisation (donnée Commande : T_Commande) Cumule les quantités des commandes ayant la même référence, un changement de référence provoque l'écriture de la commande cumulée dans le fichier en sortie 1 variables Commande_Totale : T_Commande I rémanente 1 répéter à l'infini { On est en présence d'une nouvelle référence (la Ire fois et après chaque écriture), donc on initialise référence et cumul, puis on rend la main à Comparaison pour connaître la suite à donner } Commande-Totale > - Commande activer Comparaison Cumuler les quantités tant que la référence ne change pas I 154 - MICRO-SYSTEMES Juin 1989
PROGRAMMATION tant que Référence(Commande) = Référence(Commande_Totale) répéter La référence n'a pas changé, on cumule puis on rend la main à Comparaison pour la suite I Quantité(Commande_Totale) > - Quantité(Commande_Totale) + Quantité(Commande) activer Comparaison La référence a changé, on écrit } écrire(Fichier_Sortie,Commande_Totale) Codage en Turbo Pascal 4.0 Nous avons choisi le type Word pour les Références ; la valeur de Référence_Bidon (+ oo) est donc 65535. Les fichiers CMD.xx doivent évidemment avoir été créés avant exécution du programme. La seule difficulté tient au fait que la procédure Transfer, telle que nous l'avons implémentée, ne permet pas de transmettre les paramètres nécessaires à chaque nouvelle activation des coprogrammes de lecture et de totalisation. Pour résoudre ce problème, nous avons simulé un passage de paramètre par adresse pour les données comme pour les résultats. Ces deux coprogrammes travaillent en fait avec des pointeurs (Ptr_Fichier pour le paramètre Fichier du coprogramme de lecture et Ptr_Commande pour le paramètre Commande de ces deux coprogrammes) que le coprogramme de sélection est chargé d'affecter convenablement avant chaque activation. Les suites Commande_i et Fichier_i sont implémentées sous forme de tableaux. On trouvera la liste de ce programme en annexe (programme Totalisation_des_Commandes). Coprogrammes avec paramètres Nous avons remarqué à propos de l'exemple précédent qu'il peut être souhaitable de transmettre un paramètre à un coprogramme lors de chaque activation. Nous retiendrons, pour des raisons de commodité d'implémentation et de souplesse d'utilisation, un passade de paramètre par adresse. Il sera alors possible de créer un coprogramme COPROG sur une procédure PROG déclaree par : PROCEDURE PROG (VAR Parametre : T_Parametre), et d'activer ce coprogramme par : TRANSFER(Autre_Coprog, Coprog, Un-Parametre) où Un_Parametre est une variable de type T_Parametre, en modifiant la procédure Transfer pour qu'elle réponde à la déclaration : PROCEDURE TRANSFER (VAR Coprogrammel, Coprogramme2 : T_Coprogramme ; Ptr_Parametre : Pointer) et recopie la valeur de Ptr_Parametre (qui est l'adresse de Un_Parametre), dans la pile de COPROG. Lors d'un appel normal de la procédure PROG, l'adresse du paramètre à transmettre est empilée, puis l'adresse de retour, et enfin le registre BP est sauvegardé sur la pile pour pouvoir être utilisé comme registre de base lors des accès aux variables locales et bien sûr à l'adresse du paramètre : en [BP + 4] ou [BP + 6] suivant le type d'appel à PROG (court ou long) ; comme la procédure Transfer restaure la valeur de ce registre, elle peut en disposer pour copier la valeur de Ptr_Parametre (voir le schéma de la pile dans la liste d'assemblage). Il nous faut cependant choisir entre [BP + 4] et [BP + 6] ; nous conviendrons donc que tous les coprogrammes seront créés sur des procédures de type FAR, ce qui peut se réaliser en définissant PROG dans une autre unité de programme ou simplement en compilant PROG avec la directive de compilation I$F+1. Les modifications apportées ont été ajoutées à l'intérieur de directives d'assemblage conditionnelles, ce qui permet de disposer d'une version ou de l'autre lors de l'assemblage : TASM/dParametre-Transfer TRANSFER version avec paramètre, TASM TRANSFER version sans paramètre. (Nous avons choisi le Turbo-Assembleur de Borland car il supporte l'imbrication de structures : déclaration « Ptr_Param T_Ptr_Param < > » dans la structure de pile et accès à un mot de ce champ par « MOV DX,Pile.Ptr_Param.Bas » par exemple ; on peut évidemment adapter pour MASM.) L'unité Coprogrammes et plus particulièrement la procédure NewProcess doivent être adaptées à cette nouvelle version de Transfer ; nous l'avons fait là aussi avec des directives de compilation conditionnelles. Si les modifications de la partie interface sont évidentes, quelques points méritent d'être soulignés dans la partie implémentation. La procédure NewProcessinitialise la pile du coprogramme et doit donc tenir compte de la nouvelle structure de celle-ci (deux nouveaux champs : Ptr_Param pour le paramètre supplémentaire de Transfer et Adr_Param pour celui du coprogramme), et le regsitre BP doit maintenant être initialisé pour que l'accès au paramètre puisse se faire convenablement lors de la première activation ; la valeur qu'il convient de lui assigner est celle du pointeur de pile SP après le préambule de la procédure PROG : 10 octets viennent d'être empilés (adresse du paramètre de PROG : 4 octets, adresse de retour long : 4 octets, et la sauvegarde de BP lui-même : 2 octets). Il serait dommage de ne pas profiter davantage de cette étude sur l'initialisation de la pile ; aussi allons-nous montrer maintenant comment transmettre un paramètre lors de la création du coprogramme, ce qui permettra de créer plusieurs coprogrammes sur la même procédure, chacun d'eux exécutant le code de celle-ci sur un objet différent. Cette manière de faire sera d'ailleurs plus prometteuse dans un contexte multitâche (où le transfert sera du ressort du noyau). Les modifications à apporter à la procédure NewProcess sont élémentaires : - déclaration d'un paramètre supplémentaire (Ptr_Parametre : Pointer) dans la partie interface ; - copie de la valeur de ce paramètre sur la pile (Adr-Parametre : = Ptr_Parametre). Ces modifications seront effectives si le symbole Parametre-NewProcess est défini lors de la compilation ; pour simplifier au maximum l'écriture des directives conditionnelles, certains éléments subsistent dans toutes les versions, ce qui Juin 1989 MICRO-SYSTEMES - 155



Autres parutions de ce magazine  voir tous les numéros


Liens vers cette page
Couverture seule :


Couverture avec texte parution au-dessus :


Couverture avec texte parution en dessous :


Micro Systèmes numéro 98 juin 1989 Page 1Micro Systèmes numéro 98 juin 1989 Page 2-3Micro Systèmes numéro 98 juin 1989 Page 4-5Micro Systèmes numéro 98 juin 1989 Page 6-7Micro Systèmes numéro 98 juin 1989 Page 8-9Micro Systèmes numéro 98 juin 1989 Page 10-11Micro Systèmes numéro 98 juin 1989 Page 12-13Micro Systèmes numéro 98 juin 1989 Page 14-15Micro Systèmes numéro 98 juin 1989 Page 16-17Micro Systèmes numéro 98 juin 1989 Page 18-19Micro Systèmes numéro 98 juin 1989 Page 20-21Micro Systèmes numéro 98 juin 1989 Page 22-23Micro Systèmes numéro 98 juin 1989 Page 24-25Micro Systèmes numéro 98 juin 1989 Page 26-27Micro Systèmes numéro 98 juin 1989 Page 28-29Micro Systèmes numéro 98 juin 1989 Page 30-31Micro Systèmes numéro 98 juin 1989 Page 32-33Micro Systèmes numéro 98 juin 1989 Page 34-35Micro Systèmes numéro 98 juin 1989 Page 36-37Micro Systèmes numéro 98 juin 1989 Page 38-39Micro Systèmes numéro 98 juin 1989 Page 40-41Micro Systèmes numéro 98 juin 1989 Page 42-43Micro Systèmes numéro 98 juin 1989 Page 44-45Micro Systèmes numéro 98 juin 1989 Page 46-47Micro Systèmes numéro 98 juin 1989 Page 48-49Micro Systèmes numéro 98 juin 1989 Page 50-51Micro Systèmes numéro 98 juin 1989 Page 52-53Micro Systèmes numéro 98 juin 1989 Page 54-55Micro Systèmes numéro 98 juin 1989 Page 56-57Micro Systèmes numéro 98 juin 1989 Page 58-59Micro Systèmes numéro 98 juin 1989 Page 60-61Micro Systèmes numéro 98 juin 1989 Page 62-63Micro Systèmes numéro 98 juin 1989 Page 64-65Micro Systèmes numéro 98 juin 1989 Page 66-67Micro Systèmes numéro 98 juin 1989 Page 68-69Micro Systèmes numéro 98 juin 1989 Page 70-71Micro Systèmes numéro 98 juin 1989 Page 72-73Micro Systèmes numéro 98 juin 1989 Page 74-75Micro Systèmes numéro 98 juin 1989 Page 76-77Micro Systèmes numéro 98 juin 1989 Page 78-79Micro Systèmes numéro 98 juin 1989 Page 80-81Micro Systèmes numéro 98 juin 1989 Page 82-83Micro Systèmes numéro 98 juin 1989 Page 84-85Micro Systèmes numéro 98 juin 1989 Page 86-87Micro Systèmes numéro 98 juin 1989 Page 88-89Micro Systèmes numéro 98 juin 1989 Page 90-91Micro Systèmes numéro 98 juin 1989 Page 92-93Micro Systèmes numéro 98 juin 1989 Page 94-95Micro Systèmes numéro 98 juin 1989 Page 96-97Micro Systèmes numéro 98 juin 1989 Page 98-99Micro Systèmes numéro 98 juin 1989 Page 100-101Micro Systèmes numéro 98 juin 1989 Page 102-103Micro Systèmes numéro 98 juin 1989 Page 104-105Micro Systèmes numéro 98 juin 1989 Page 106-107Micro Systèmes numéro 98 juin 1989 Page 108-109Micro Systèmes numéro 98 juin 1989 Page 110-111Micro Systèmes numéro 98 juin 1989 Page 112-113Micro Systèmes numéro 98 juin 1989 Page 114-115Micro Systèmes numéro 98 juin 1989 Page 116-117Micro Systèmes numéro 98 juin 1989 Page 118-119Micro Systèmes numéro 98 juin 1989 Page 120-121Micro Systèmes numéro 98 juin 1989 Page 122-123Micro Systèmes numéro 98 juin 1989 Page 124-125Micro Systèmes numéro 98 juin 1989 Page 126-127Micro Systèmes numéro 98 juin 1989 Page 128-129Micro Systèmes numéro 98 juin 1989 Page 130-131Micro Systèmes numéro 98 juin 1989 Page 132-133Micro Systèmes numéro 98 juin 1989 Page 134-135Micro Systèmes numéro 98 juin 1989 Page 136-137Micro Systèmes numéro 98 juin 1989 Page 138-139Micro Systèmes numéro 98 juin 1989 Page 140-141Micro Systèmes numéro 98 juin 1989 Page 142-143Micro Systèmes numéro 98 juin 1989 Page 144-145Micro Systèmes numéro 98 juin 1989 Page 146-147Micro Systèmes numéro 98 juin 1989 Page 148-149Micro Systèmes numéro 98 juin 1989 Page 150-151Micro Systèmes numéro 98 juin 1989 Page 152-153Micro Systèmes numéro 98 juin 1989 Page 154-155Micro Systèmes numéro 98 juin 1989 Page 156-157Micro Systèmes numéro 98 juin 1989 Page 158-159Micro Systèmes numéro 98 juin 1989 Page 160-161Micro Systèmes numéro 98 juin 1989 Page 162-163Micro Systèmes numéro 98 juin 1989 Page 164-165Micro Systèmes numéro 98 juin 1989 Page 166-167Micro Systèmes numéro 98 juin 1989 Page 168-169Micro Systèmes numéro 98 juin 1989 Page 170-171Micro Systèmes numéro 98 juin 1989 Page 172-173Micro Systèmes numéro 98 juin 1989 Page 174-175Micro Systèmes numéro 98 juin 1989 Page 176-177Micro Systèmes numéro 98 juin 1989 Page 178-179Micro Systèmes numéro 98 juin 1989 Page 180-181Micro Systèmes numéro 98 juin 1989 Page 182-183Micro Systèmes numéro 98 juin 1989 Page 184-185Micro Systèmes numéro 98 juin 1989 Page 186-187Micro Systèmes numéro 98 juin 1989 Page 188