MagPI 11 Page 31

De Le French MagPi
Aller à : Navigation, rechercher

Charm offre deux puissantes opérations de transtypage via les constructions address (variable) pour convertir en entier une variable de tout type et [int] pour convertir un entier vers un autre type. Un grand pouvoir implique de grandes responsabilités cependant, elles sont donc utilisées mais rarement et alors avec précaution. Un exemple se trouve dans le module de bibliothèque Charm debug qui convertit l'adresse du tas en tableau d'octets pour que son contenu puisse être exporté dans un fichier.


Portée

La portée d'une variable se réfère à l'endroit à partir duquel elle est accessible et est liée à sa durée de vie. Une variable peut résider dans l'un des emplacements suivants :

Emplacement Durée de vie Consruction
statique programme type v = valeur;
tas variable type v := new V;
pile portée type v := valeur;


Les variables statiques existent tout au long du programme et sont initialisées lors de la compilation, avec zéro ou nil pour les références. Celles déclarées sur le tas sont créées par l'opérateur new et libérées par l'opérateur delete lorsqu'elles ne sont plus nécessaires. Les variables sur la pile n'existent que dans la portée où elles sont définies, normalement lorsque la procédure est quittée, ou à la fin de l'exécution d'un bloc de code entre les délimiteurs { et }.


Les procédures nommées ~startup et ~shutdown peuvent servir à définir des variables statiques tandis que ~new et ~delete servent à définir des variables stockées dans le tas ou sur la pile quand il faut plus d'une simple compilation ou faire des affectations lors de l'exécution.


Pour limiter la visibilité des informations, les constantes, variables et procédures ne sont par défaut accessibles que dans le module où elles sont déclarées. Cependant, grâce au mot-clé export, il est possible de rendre ces définitions disponibles pour les autres modules. Il faut référencer les modules pour indiquer explicitement leurs dépendances grâce au mot-clé import afin de préciser chaque module dont les définitions publiques doivent être utilisées. Ces références doivent ensuite être qualifiées avec le nom du module importé e.g. Out.vdu.str fait référence à la procédure str de l'instance vdu du module de bibliothèque Out utilisé pour afficher des chaînes à l'écran.


La prochaine fois

La prochaine fois j'envisage d'aborder certains aspects de la programmation Charm avec des exemples de séquences, sélections et itérations pour écrire des expressions, affectations et structures de contrôle.


Exercice

Pour finir, je propose comme exercice ce mois-ci le remplacement du module par défaut !NewProject MyProject par le code suivant pour afficher les racines carrées des douze premiers entiers calculés par la méthode de Newton-Raphson :

import lib.Out;

module MyProject
{
  proc sqrt (int n) real
  {
    real v := 1;
    for int i := 0 step inc (i)
    while i < 5 v :=
    (v + n / v) / 2;
    return v;
  }

  export proc start (ref array ref
  array char argv)
  {
    for int i := 1 step inc (i)
    while i <= 12
    Out.vdu.str ("sqrt ").num_fld
    (i, 2).str (" = ").float_fld
    (sqrt (i), 10).nl ();
  }
}
Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Boîte à outils