MagPI 11 Page 30

De Le French MagPi
Aller à : Navigation, rechercher

renvoyer une valeur d'un type spécifié en utilisant dans ce cas le mot-clé return, les appels dans les expressions peuvent être substitués par une variable de ce type.


Les variables de type ref peuvent recevoir la valeur spéciale nil qui indique qu'elles ne pointent sur rien. Une tentative pour accéder à une donnée quand un pointeur a cette valeur déclenche une exception à l'exécution. Ces variables peuvent néanmoins être comparées à la valeur nil pour voir si elles contiennent une référence valide.


Notez que pour comparer des pointeurs, les opérateurs classiques = et # deviennent  :=: et :#: car les premiers provoquent leur déférencement avant d'effectuer la comparaison.


Chaînes

Maintenant regardons de plus près un type particulièrement répandu dans Charm, nommé ref array char pour pointer sur une chaîne :


array [] char hello = ('H', 'e',
'l', 'l', 'o', 0);
ref array char hello_string = hello;


où la partie intéressante de l'arbre des types du compilateur Charm est :


(image)


Nous pouvons l'afficher à l'écran grâce au flux standard vdu du module Out comme ceci :

Out.vdu.str (hello_string).nl ();


Quelques points à souligner :

  • Toutes les chaînes se terminent par un caractère nul.
  • La taille est calculée automatiquement par le compilateur, mais si elle devait être saisie explicitement ce serait [6] pour tenir compte du zéro final.
  • Les caractères peuvent être extraits grâce à leur index, de 0 à la taille de la chaîne moins un, par exemple hello_string[1] contient 'e'.


Comme les chaînes sont très utilisées, le compilateur associe les littéraux chaînes comme "Hello" au type ref array char et ajoute automatiquement le zéro final, il est donc possible d'écrire plus concisément :

ref array char hello_string = "Hello";

En réalité, l'un des prototypes de la procédure ~start de Charm définissant le point d'entrée d'un programme prend deux paramètres, le premier - un entier - donne le nombre d'arguments passés en ligne de commande, le second - de type ref array ref array char - qui semble intimidant à première vue est juste un pointeur sur un tableau de chaînes (une par argument).


Nos affaires de chaînes ne sont pas finies, les bibliothèques Charm contiennent un module String proposant une instance dynamique d'une chaîne modifiable. Elle est stockée dans le tas, grossit si nécessaire, et est automatiquement libérée par le destructeur String lorsque l'objet est hors de "portée" (voir plus loin).



Conversions de types

D'habitude, le compilateur interdit d'utiliser des variables de types différents pour les affectations : cela n'a souvent pas de sens, par exemple assigner un réel à un booléen. Les trois types arithmétiques char, int et real peuvent néanmoins être combinés, le compilateur générant alors un résultat ayant la plus grande largeur (le plus grand nombre de bits) parmi les opérandes. Il est également possible de combiner ces types dans les parties gauche ou droite des affectations, en veillant à la perte de précision si la partie gauche est moins large que le résultat qui lui est affecté.

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Boîte à outils