Gestion des variables locales

Gestion des variables locales

Vous avez déjà vu au travers de cet ouvrage des utilisations de variables locales. Il s’agit de variables qui sont accessibles et utilisables dans le bloc où elles sont déclarées. Dim X As Integer For X = 1 to 10 Dim Y As Integer Y=0 MessageBox.Show(« X =  » & X) MessageBox.Show(« Y =  » & Y) Next X MessageBox.Show(« X final =  » & X) MessageBox.Show(« Y final =  » & Y) Dans ce bout de programme, la boucle devrait faire dix tours et afficher les valeurs de X entre 1 et 10, et dix fois Y=0. Enfin une boîte de dialogue devrait afficher X = 10 et Y=0. Or, ce bout de programme provoque une erreur. En effet, lors de l’affichage final de Y, la variable n’est plus accessible. Étant définie dans la boucle, Y n’est accessible que dans cette boucle. Sa portée, c’est-à-dire son accessibilité, est limitée à ladite boucle. On dit que Y est une variable locale de cette boucle. Les variables locales sont gérées dans la pile. La pile est une zone mémoire dédiée à l’utilisation des variables locales. On peut la symboliser comme une vraie pile, composée de plusieurs petits blocs de mémoire que sont les variables : Figure 9.21 : Accès à une variable hors de portée 198 LE GUIDE COMPLET Chapitre 9 Passer au niveau supérieur Dans cette pile, ce qui va marquer l’accessibilité des variables est un petit marqueur : Quand vous déclarez une variable, un emplacement mémoire va être utilisé, et ce marqueur va être déplacé : Dim X As Integer Le programme pourra alors accéder aux parties de la mémoire qui sont au-dessus de ce marqueur. X vient d’être déclarée, elle est au-dessus du marqueur, on peut l’utiliser. Cependant, vous n’avez pas donné à X de valeur initiale. Entre sa déclaration et l’entrée dans la boucle, on ne sait pas ce que vaut X. Lorsque l’on déclare des variables, le marqueur se déplace vers le bas, donnant ainsi l’accès à de nouvelles variables. Or, ce marqueur se déplace aussi vers le haut, bloquant ainsi l’accès à d’anciennes variables. Il se déplace essentiellement vers le haut lorsque l’on sort d’un bloc. En Visual Basic, on peut dire que la fin d’un bloc correspond à un endroit où il y a un End.

Les constructeurs d’objets

Lorsque nous avons présenté les mécanismes de la programmation orientée objet, il a été question du mot-clé New dans le cadre de la création d’un objet. Ce mot-clé permet d’instancier un objet. Qu’est-ce que l’instanciation ? C’est le mécanisme qui permet de créer un objet, une instance de classe. Son rôle réel est en fait de réserver un espace mémoire pour l’utilisation de l’objet et, le cas échéant, d’initialiser certains de ses attributs. Cependant, la gestion de la mémoire n’est pas la même pour les objets et pour les variables locales. En effet, un objet doit rester en mémoire jusqu’à ce que vous n’en ayez plus besoin. Il ne peut alors pas être stocké dans la pile. Les objets sont stockés dans le tas managé. Elément indéfin i Emplacement mémoire Va riabl e et valeur Emplacement actuel du marqueur mémoire .Le tas managé est un gros espace de mémoire réservé au programme. Celui–ci pourra y stocker tous les objets nécessaires à son exécution. Lorsqu’une classe est instanciée, le programme lui crée un espace mémoire dans le tas managé. Cela se fait grâce au constructeur. Dim monChasseur As New AvionDeChasse() Le constructeur est la partie qui suit New. C’est une méthode qui a pour nom celui de la classe et lui seul permet d’instancier cette classe. Il existe un constructeur par défaut. C’est pourquoi vous n’avez pas eu à l’indiquer lors de l’écriture de la classe AvionDeChasse. Dans ce cas, il réserve juste l’espace mémoire. Cependant, il est possible de redéfinir le constructeur, et ainsi de pouvoir faire un certain nombre d’opérations lors de l’instanciation. Vous pouvez modifier sa signature, en ajoutant des paramètres par exemple. Il se crée comme une méthode qui ne renvoie aucune valeur de retour et dont le nom est New. Appliquons cela à l’avion de chasse : Public Class AvionDeChasse ’ Nous ne gardons qu’une partie de la classe ’ pour cette illustration Private vitesseMax As Integer Private nbreAilerons As Integer Private reserveKerozene As Integer Public Sub afficheKero() MessageBox.Show(« Niveau kéro: »& Me.reserveKerozene) End Sub Public Sub New(ByVal keroOriginal As Integer) Me.reserveKerozene = keroOriginal End Sub End Class On redéfinit le constructeur en lui ajoutant un paramètre qui permettra d’initialiser son niveau de kérosène à l’instanciation. Pour appeler ce constructeur, il suffira de tenir compte de la nouvelle signature, et donc d’ajouter ce paramètre : Dim monChasseur As New AvionDeChasse(100) monChasseur.afficheKero() Un objet AvionDeChasse a été créé avec un niveau de kérosène valant 100. Cela est confirmé par la boîte de dialogue, qui affichera « Niveau kéro : 100 ».

LIRE AUSSI :  Formation C++ Format des entrées-sorties et carte de référence STL

Récupération de la mémoire : le ramasse-miettes

Comme nous l’avons expliqué, le tas managé est un espace de mémoire réservé à l’application, dans lequel le programme va pouvoir stocker les objets qu’il utilise. Cependant, cet espace est limité, et vous n’avez pas donné de limite au nombre possible d’objets à instancier. Pourtant il y en a une : celle de la capacité du tas managé. Si celui-ci est trop plein et que vous vouliez instancier des objets, une exception OutOfMemoryException est levée. On a un espace mémoire, on peut réserver des emplacements dans cet espace, mais il faut pouvoir libérer ceux dont on ne se sert pas. Cette tache est effectuée par un mécanisme appelé « ramasse-miettes » (garbage collector), qui s’occupe de libérer l’espace mémoire occupé par des objets dont vous ne vous servez plus. Le programme sait quels sont les objets que vous allez pouvoir utiliser ou pas. Si vous pouvez les utiliser, on dit qu’ils sont référencés. Dans le cas contraire, on dit qu’ils sont déréférencés. Prenons ce morceau de programme relatif aux avions : Public Sub essaiDereferencement() Dim monChasseur2 As New AvionDeChasse() End Sub Dim monChasseur1 As New AvionDeChasse() essaiDereferencement() On déclare une fonction qui instancie un chasseur, puis on instancie un autre chasseur et l’on fait appel à cette fonction. À la fin du programme, en admettant qu’il continue après, on pourra toujours utiliser monChasseur1. monChasseur1 est donc référencé. Par contre monChasseur2 est instancié dans la fonction essaiDereferencement. Or, en sortant de cette fonction, on ne peut plus y accéder. En effet, il a été déclaré dans une fonction, et bien qu’il existe en mémoire dans le tas managé, sa portée ne peut aller au-delà de la fonction essaiDereferencement. 

Formation et coursTélécharger le document complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *