| DIM | commande |
Syntaxe : DIM declaration1 [,declaration2...]
Révision : 26 juillet 2000 (Release 3)
Description : Note : La description qui suit s’applique aux commandes DIM qui se trouvent à l’intérieur des blocs de définition de “vrai record” (BEGIN RECORD…END RECORD), aussi bien qu’à celles qui sont situées à l’extérieur de ces blocs. Les commandes DIM situées dans des blocs de définition de “pseudo record” (DIM RECORD…DIM END RECORD) sont utilisées quelque peu différemment, voyez la commande DIM RECORD pour plus d’informations.
La Release 3 a introduit une nouvelle syntaxe pour la commande DIM. DIM AS LONG a,b,c
DIM AS RECT monRectangle La syntaxe DIM AS indique que toutes les variables qui suivent sont du même type et de la même taille. Ceci est différent de DIM AS LONG qui attribue des spécifications à une seule variable par instruction.
DIM est une commande non-exécutable qui permet au compilateur de déterminer combien d’espace de stockage il doit allouer pour les variables, les tableaux et les champs de records qui sont déclarés, et d’identifier leur type de donnée. La commande DIM peut aussi être utilisée pour affecter la position relative en mémoire des variables, tableaux et champs déclarés. Le paramètre declaration peut prendre l’une des formes suivantes : Variables simples : {[@]nomVar | [longueurMax] varChaine$ }[;statExpr]
varAtypique AS typePredefini [;statExpr] varAtypique AS typeUtilisateur [;statExpr] Records : varAtypique.constante [;statExpr]
varAtypique AS typeRecord [;statExpr] Tableaux : {nomVar | [longueurMax] stringVar$}(maxIndice1[,maxIndice2...])[;0]
varAtypique (maxIndice1 [,maxIndice2...]) AS typePredefini [;0] varAtypique (maxIndice1 [,maxIndice2...]) AS typeUtilisateur varAtypique.constante (maxIndice1 [,maxIndice2...]) Pointeurs : [@]varAtypique AS {POINTER TO|^|@|.}{typePredefini|typeRecord}
Handles : [@]varAtypique AS {HANDLE TO|^^|@@|..}{typePredefini|typeRecord}
Déclarations d’Alignement Mémoire {%|&|&&|&&&|.constante}
Si une commande DIM apparaît à l’intérieur d’un bloc BEGIN GLOBALS…END GLOBALS, alors la portée des variables et tableaux déclarés est globale. Si elle apparaît à l’intérieur d’une fonction LOCAL ou d’une procédure ENTERPROC (mais, non à l’intérieur d’un bloc BEGIN GLOBALS…END GLOBALS), alors la portée des variables et tableaux déclarés est locale à cette fonction ou à cette procédure. Si la commande DIM apparaît à l’extérieur de toutes les fonctions et procédures (et à l’extérieur d’un bloc BEGIN GLOBALS…END GLOBALS), alors la portée des variables et tableaux déclarés est locale au “programme principal”. Votre programme peut comporter autant de commandes DIM que vous le souhaitez. La déclaration suivante : DIM a, b&, c$, d#
est équivalente aux deux instructions suivantes :
DIM a, b&
DIM c$, d# Certaines structures doivent toujours être déclarées par une commande DIM, qui doit apparaître quelque part avant la ligne où la structure est effectivement utilisée. Ces structures comprennent :
Si l’option _dimmedVarsOnly du compilateur est active, alors cette restriction s’applique à toutes les variables, à l’exception de celles figurant dans la liste des paramètres des commandes LOCAL FN ou ENTERPROC. Si l’option _dimmedVarsOnly du compilateur n’est pas active, alors les chaînes simples et les variables numériques n’ont pas besoin d’être déclarées avec DIM. Dans ce cas, une variable simple est Implicitement déclarée dans la première instruction où elle apparaît (avec la portée qui lui correspond), et le compilateur utilise cette déclaration implicite pour allouer l’espace de stockage adéquat. L’espace de stockage pour les types prédéfinis par FutureBASIC est alloué comme suit :
(Note : l’espace de stockage des variables en double précision dépend du type de processeur (CPU 68K ou PPC) cible de votre compilation : 10 octets en 68K et 8 octets en PPC. Utilisez la fonction SIZEOF pour déterminer de manière certaine les tailles de ces variables. L’espace de stockage alloué à une variable chaîne dépend de la valeur du paramètre longueurMax (qui ne peut excéder 255). Si longueurMax est omis, alors le paramètre longueurMax spécifié le plus récemment dans une commande DIM est utilisé. S’il n’y a pas de paramètre longueurMax spécifié antérieurement dans une commande DIM, alors la valeur spécifiée par la plus récente commande DEF LEN est utilisée. S’il n’y a pas de commande DEF LEN précédant la commande DIM, alors le paramètre longueurMax prendra sa valeur par défaut à 255. Les variables chaînes déclarées avec la clause AS STR255 ont toujours une valeur pour longueurMax de 255. Une fois que le paramètre longueurMax a été déterminé pour une variable chaîne donnée, le nombre réel d’octets alloués pour cette variable est : • longueurMax + 1 octet, si longueurMax est impair; • longueurMax + 2 octets, si longueurMax est pair; Votre programme ne doit pas assigner plus de longueurMax caractères à une variable chaîne. L’espace de stockage d’une variable record est égal à la somme des tailles de ses champs, ou à la valeur constant2 (en octets). L’espace de stockage pour un tableau est calculé comme suit : Si tailleElem est la taille en octets d’un élément du tableau, alors l’espace alloué pour le tableau entier est donné par la formule suivante : taille du tableau = tailleElem * (maxIndice1 + 1) * (maxIndice2 + 1) * ...
Tous les éléments d’un tableau sont stockés en mémoire de manière contiguë. Si le tableau est multidimensionnel, alors la dimension la plus à droite change plus rapidement à mesure que vous vous déplacez dans le tableau en mémoire.
Par exemple, si vous déclarez un tableau comme suit : DIM p%(3, 2)
Alors les éléments de p%() sont stockés en mémoire dans cet ordre :
p%(0,0)
p%(0,1) p%(0,2) p%(1,0) p%(1,1) p%(1,2) p%(2,0) p%(2,1) p%(2,2) p%(3,0) p%(3,1) p%(3,2) Utilisation du symbole “@” pour contrôler le stockage en RAM Afin augmenter la vitesse d’exécution d’un programme, FB^3 peut stocker certaines variables dans des registres du CPU plutôt que dans une mémoire adressable en RAM (plus lente). Si vous utilisez la commande REGISTER ON, ou que l’option du compilateur “Mettre les variables en registres ” est activée dans les préférences, FB^3 range dans les registres du CPU, autant de variables qu’il peut, lorsque ces variables sont du type entier court, entier long ou octet. Le compilateur commence avec la première variable qu’il rencontre, et continue à assigner les variables à la suite dans des registres jusqu’à ce qu’il n’y ait plus aucun registre disponible. Quelquefois cette méthode n’est pas appropriée. Si votre programme a besoin d’obtenir l’adresse d’une variable, cette variable doit être stockée dans un espace adressable en RAM. Lorsque vous mettez un symbole “@” devant un nom de variable dans une commande DIM, vous forcez toutes les variables qui suivent la commande DIM (à la droite de “@”) à être stockées en RAM plutôt que dans des registres du CPU. Voyez les commandes REGISTER ON/OFF pour plus d’informations. Utilisation des Déclarateurs d’Alignement Mémoire pour ajuster l’endroit de stockage. Un déclarateur d’alignement mémoire (%, &, &&, &&&) affecte l’endroit de stockage d’une variable simple ou de type record qui est déclarée après, en forçant la variable à commencer à une position d’octet dont l’adresse est divisible par 2, 4, 8 ou 16. Cela peut améliorer l’efficacité de certaines opérations de bas niveau qui impliquent cette variable, et peut, de ce fait, améliorer la rapidité d’exécution de votre programme. Le déclarateur mémoire .constant2 force l’insertion d’un nombre arbitraire d’octets vides entre deux variables.
Note : l’utilisation des déclarateurs d’alignement ci-dessus force également les variables restantes déclarées dans la commande DIM (à la droite du déclarateur) à être stockées dans un espace mémoire adressable plutôt que dans des registres du CPU. Voyez les commandes REGISTER ON/OFF pour plus d’informations. Utilisation de la syntaxe point-virgule(;)pour ajuster l’endroit de stockage (pour des variables qui ne sont pas des tableaux) Les variables simples et de type record sont normalement stockées dans un espace contigu en mémoire, selon l’ordre dans lequel elles sont déclarées. Par exemple, examinez l’instruction DIM suivante : DIM x%, monRect.8, 15 s1$, y&
En admettant qu’aucune de ces variables n’a été implicitement déclarée avant la commande DIM, et qu’elles sont toutes localisées dans un espace mémoire adressable en RAM, alors elles apparaîtront de manière contiguë en mémoire, comme illustré dans ce diagramme :
• Si constant1 est plus grand que la taille de stockage de var, alors des octets supplémentaires (sans référence) seront réservés après la variable var. Par exemple : DIM maVar;8, z&
Cette instruction demande au compilateur d’allouer l’espace de stockage comme suit (en admettant que le type par défaut des variables atypiques est entier court sur 2 octets) :
![]() • Si constant1 est plus petit que la taille de la variable var, alors vous pouvez forcer des variables à “se chevaucher” en mémoire.. Ceci produit un effet similaire au mot-clé “union” du C, ou à la commande “EQUIVALENCE” du ForTran. Par exemple : DIM monLong&;0, motFort%, motFaible%
Ici, on demande au compilateur de ne mettre aucun décalage entre le début de monLong& et le début de motFort%. Le résultat ressemble à ceci:
![]() L’exemple qui suit pousse ce concept un peu plus loin : DIM rect.8;0, pt1.4;0, longPt1&;0, y1%, x1%
DIM pt2.4;0, longPt2&;0, y2%, x2% Ici, les variables sont stockées de la manière suivante :
![]() Si vous utilisez la syntaxe point-virgule en conjonction avec un déclarateur d’alignement mémoire, alors les effets sont combinés. Par exemple, si vous déclarez ceci : DIM 13 z$;7, &, x%
alors la variable x% commence à la première frontière de mot long qui est située à 7 octets au moins après le début de la variable z$.
Note : L’utilisation du point-virgule dans une déclaration (à l’exception des tableaux) force la variable qui précède le point-virgule, et toutes les variables qui le suivent dans la même instruction DIM, à être stockées en mémoire adressable, plutôt que dans des registres du CPU. Voyez les commandes REGISTER ON/OFF pour plus d’informations. Utilisation de la syntaxe “;0” avec les tableaux La syntaxe point-virgule peut être utilisée d’une manière limitée avec les tableaux de variables simples (ce qui exclut les tableaux de records). Par exemple, en déclarant ce qui suit : DIM abc&(10,15);0
vous demandez au compilateur d’aligner le début du tableau de variables simples qui sera déclaré juste après avec le début du tableau abc&(). Cet autre tableau n’a pas besoin d’être du même type simple, ni d’avoir les mêmes dimensions que le tableau abc&(). Notez que, la syntaxe point-virgule n’est pas valable pour les tableaux de records. De plus, lorsque vous utilisez le point-virgule avec des tableaux, vous devez faire suivre le point-virgule par un zéro, vous ne pouvez pas utiliser de constante arbitraire dans ce cas.
FB^3 range les tableaux et les variables qui ne sont pas des tableaux dans des endroits séparés en mémoire. Vous ne pouvez pas utiliser le point-virgule après une variable qui n’est pas un tableau pour ajuster l’endroit de stockage d’un tableau, et réciproquement non plus. Voir Aussi : BEGIN GLOBALS...END GLOBALS; DIM RECORD; BEGIN RECORD...END RECORD; REGISTER ON/OFF; Annexe C: Types de données - IV Containers |