DIM{}
DESCRIPTION.
La fonction DIM{} permet de déclarer des structures de données.
Voir l'instruction DIM pour déclarer un tableau de données.
Voir l'instruction DIM pour réserver une zone mémoire.
Voir la fonction DIM() pour connaitre la taille d'un tableau ou d'une structure.
SYNTAXE.
DIM DCT_Donnees{ donneeA?, donneeB?, ... , donneeN?}
DIM DCT_Donnees{ (taille)donneeA?, donneeB?, ... , donneeN?}
DIM DCT_Cible{} = DIM DCT_Source{}
DIM DCT_Cible{(taille)} = DIM DCT_Source{}
REMARQUES.
DCT_Donnees et donneeA peut être n'importe quelle combinaison de lettres majuscules ou minuscules et de chiffres, mais commençant par une lettre et qui ne soit pas un mot-clé du BBC BASIC.
? peut être :
- rien, pour des valeurs numériques variables, entières ou réelles à virgule flottante ;
- &, pour des nombres entiers de 0 à 255 ;
- %, pour des nombres entiers de −2147483648 à 2147483647 ;
- %%, pour des nombres entiers de −9223372036854775808 à 9223372036854775807 ;
- #, pour des nombres réels de ±2,3E−308 à ±1,7E308 ;
- $, pour des chaines de caractères ;
Une structure de données doit être déclarée avant son utilisation. Une fois déclarée, le format d'une structure de données ne peut plus être modifié. Il est cependant possible de déclarer plusieurs fois une structure de données avec les mêmes caractéristique, mais dans se cas les valeurs de ses éléments resteront inchangées, ils ne sont pas réinitialisés.
Contrairement aux tableaux de données, une structure de données est un ensemble de données qui peuvent être de type différent. Chaque élément est défini par un nom unique dans la structure, et éventuellement avec un suffixe pour préciser son type de donnée. Les éléments d'une structure de données étant nommés, il est plus facile de savoir à quoi ils correspondent que dans un tableau de données conventionnel. Par exemple : DIM DCT_Paves{largeur, longueur, hauteur } et plus éloquent que DIM LST_Paves(2).
Les éléments d'une structures de données peuvent être des nombres, des chaînes de caractères, des tableau de données et même des structures de données. Les valeurs des éléments numériques sont initialisées à 0 et les chaines de caractères avec une chaine vide. Si des éléments sont des composites, tableau ou structure de données, les valeurs des données sont initialisée avec le même principe.
QU'EST-CE QU'UNE STRUCTURE DE DONNÉES.
Une structure de données est une variable qui contient un certain nombre de valeurs, ses éléments ou items.
Contrairement aux tableaux de données, une structure de données est un ensemble de données qui peuvent être de type différent. Chaque élément est défini par un nom unique dans la structure, et éventuellement avec un suffixe pour préciser son type de donnée. Les éléments d'une structure de données étant nommés, il est plus facile de savoir à quoi ils correspondent que dans un tableau de données conventionnel. Par exemple : DIM DCT_Paves{ largeur , longueur , hauteur } et plus éloquent que DIM LST_Paves( 2 ).
Les éléments d'une structure de données peuvent être des nombres, des chaînes de caractères, des tableau de données, et même des structures de données. Les valeurs des éléments numériques sont initialisées à 0 et les chaines de caractères avec une chaine vide. Si des éléments sont des composites, tableau ou structure de données, les valeurs des données sont initialisée avec le même principe.
CRÉER UNE STRUCTURE DE DONNÉES ORDINAIRES.
Une structure de données doit être déclarée avant son utilisation. Une fois déclarée, le format d'une structure de données ne peut plus être modifiée. Il est cependant possible de déclarer plusieurs fois une structure de données avec les mêmes caractéristique, mais dans ce cas les valeurs de ses éléments resteront inchangées, ils ne sont pas réinitialisés.
Pour créer une nouvelle structure de données, il suffit de la déclarer avec le mot-clé DIM suivi du nom de la structure de données et d'ajouter dans une paire d’accolades tous les éléments qui la constituent. Par exemple, DIM DCT_Article{ nom$ , couleur$( 5 ) , taille{ lar , long } , prix , taxe& } crée et déclare une structure de données nommée DCT_Article{ }, n'oubliez pas la paire d'accolades qui fait partie du nom de la structure de données. Elle se compose de 4 éléments :
- nom$, du type string, et qui sera appelé par DCT_Article.nom$ ;
- couleur$( ), est un tableau ayant 6 items du type string, chaque item sera appelé par DCT_Article.couleur$( index ) ;
- taille{ }, est une structure ayant 2 éléments, nommés DCT_Article.dimensions.lar et DCT_Article.dimensions.long ;
- prix, du type numérique variant, et qui sera appelé par DCT_Article.prix ;
- taxe&, du type octets, et qui sera appelé par DCT_Article.taxe& ;
Notez que les éléments couleur$( ) et taille{ } n'ont pas eu à être déclarés avant d'être utilisés dans la définition de DCT_Article{ }.
Pour lire ou modifier un élément, il faut préciser d'abord le nom de la structure de données concernée, paire d'accolades comprises, puis un point et enfin le nom de l'élément à manipuler, attention de bien utiliser la paire accolades :
- kvaleur = DCT_Donnees{ }.donneeA, pour lire et retourner la valeur de l'élément et ;
- DCT_Donnees{ }.donneeA = valeur, pour modifier la valeur de l'élément.
Généralement, les éléments d'une structure de données peuvent être utilisés comme n'importe quelle autre variable de type similaire. Néanmoins, ils ne peuvent pas être utilisés avec certaines fonctions ou instructions traitant des tableaux de données, par exemple la fonction SUM( ), ou des structures de données, par exemple l'instruction SWAP. De plus, il n'est pas possible de passer, individuellement, un item d'un tableau ou un élément d'une structure présent comme élément d'une structure de données à des fonctions personnalisées avec PROC ou FN.
Note : les éléments de type octet (&) sont des cas particuliers. Un élément nommée DCT_Donnees.liste&( ) sera considéré équivalent à $$^DCT_Donnees.liste&(0), il fait donc référence à une chaine de caractères terminée par NUL stockée dans le tableau. Cela est pratique pour certaines structures utilisées par les API Windows et SDL 2.0.
De plus, sur les plateformes 64 bits uniquement, un élément d'une structure de données déclaré avec le suffise %% sera associé au type % (bien qu'il soit toujours 64 bits) et peut être appelé indifféremment avec l'un ou l'autre suffixe. Cela permet de simplifier l'accès aux pointeurs dans les structures de données, car le pointeur est déclaré comme un élément de 32 bits sur les plateformes 32 bits et comme un élément de 64 bits sur les plateformes 64 bits, sans avoir besoin de code conditionnel. Il est donc fortement recommandé de ne pas avoir 2 éléments d'une structure de données avec un même nom mais avec les 2 suffixes.
STRUCTURES DE DONNÉES PROTOTYPES.
Une fois déclarée, une structure de données peut être utilisée pour déclarer une nouvelle structure de données ayant les mêmes éléments. Les valeurs des éléments de la nouvelle structure de données sont initialisées à 0, pour les valeurs numériques et à une chaine vide pour les chaine de caractères. Les valeurs des éléments de la structure de données utilisée comme modèle ne seront pas modifiées.
Cette technique est pratique si l'on souhaite créer plusieurs structures de données devant répondre aux mêmes traitements avec des noms d'identifiants distinct de façon unique. Par exemple :
DIM DCT_Personne{ nom$ , Prenom$ , elo , partie$( 5 ) , score }
DCT_Personne{ }.elo = 1500
DIM DCT_Taeri{ } = DCT_Personne{ }
DIM DCT_Kim{ } = DCT_Personne{ }
PRINT DCT_Personne{ }.elo : REM - Retourne 1500
PRINT DCT_Taeri{ }.elo : REM - Retourne 0
Une structure de données prototype peut aussi apparaitre dans la définition comme élément dans la déclaration d'une nouvelle structure de données. Dans exemple suivant, l’élément dimensions{ } est dupliqué depuis la structure de données DCT_Pave{ }.
DIM DCT_Pave{ largeur , longueur , hauteur }
DIM DCT_Ressources{ matiere$ , couleur$ , dimensions{ } = DCT_Pave{ } , largeur , densité , poids }
TABLEAU DE STRUCTURES DE DONNÉES.
Il est possible de déclarer des tableaux de données dont les items sont des structures de données. Il existe deux syntaxes pour déclarer de tels objets dans BBC BASIC :
DIM DCT_Donnees{ ( dimension ) donneeA , donneeB , ... , donneeN }
ou en faisant une structure de données prototype :
DIM DCT_Modele{ donneeA , donneeB , ... , donneeN }
DIM DCT_Donnees{ ( dimension ) } = DCT_Modele{ }
Ces deux déclarations, créent une structure de données assimilée à un tableau de données nommée DCT_Donnees{ ( ) } ayant dimension items. Chaque item étant une structure de données ayant comme éléments donneeA, donneeB, ... , donneeN. Attention, quelle que soit la syntaxe choisie, à bien indiquer et placer les parenthèses et les accolades.
Pour lire ou modifier un élément d'un item, il faut préciser d'abord l'index de l'item de la structure concernée puis le nom de l'élément à manipuler, attention de bien utiliser et de positionner les parenthèses et les accolades :
- kvaleur = LST_Donnees{ ( rang ) }.donneeA, pour lire et retourner la valeur de l'élément et ;
- LST_Donnees{ ( rang ) }.donneeA? = valeur , pour modifier la valeur de l'élément.
Par exemple : DIM DCT_Articles{ ( 25 ) nom$ , poids , prix } crée et déclare une structure de données assimilée à un tableau de données nommé DCT_Articles{ ( ) }, n'oubliez pas la paire de parenthèses dans la paire d'accolades qui fait partie du nom de la structure de données. Elle contient 26 items, allant de l'index 0 à 25, et chaque item se compose de 3 éléments : nom$, prix et prix. L'autre syntaxe, en utilisant une structure de données prototype, serait :
DIM DCT_Article{ nom$ , poids , prix } : DIM DCT_Articles{ ( 25 ) } = DCT_Article{ }.
Bien entendu, un tableau de structure de données peut comporter plusieurs dimensions. Par exemple :
DIM DCT_Partie{ ( 8 , 40 ) blancs$ , noir$ , commentaire$ }
LES STRUCTURES DANS LES FONCTIONS PERSONNALISÉES.
Après sa déclaration dans le module principal du programme, une structure de données est de portée globale, c'est-à-dire qu'une fonction personnalisée PROC et/ou FN pourra lire et/ou modifier les valeurs de ses items.
DIM DCT_Pave{ largeur , longueur , hauteur }
FOR kvaleur = 1 TO 3 :
PRINT kvaleur; " : ";
DCT_Pave{ }.largeur = DCT_Pave{ }.largeur + kvaleur
DCT_Pave{ }.longueur = DCT_Pave{ }.longueur + kvaleur
DCT_Pave{ }.hauteur = DCT_Pave{ }.hauteur + kvaleur
PROC_Volume
NEXT kvaleur
END
REM --- Fonctions affichant le volume d'un cube ---
DEF PROC_Volume
kvolume = DCT_Pave{ }.largeur * DCT_Pave{ }.longueur * DCT_Pave{ }.hauteur
PRINT "Un cube de "; DCT_Pave.largeur; " a un volume de "; kvolume
DCT_Pave{ }.largeur = DCT_Pave{ }.largeur + 1
DCT_Pave{ }.longueur = DCT_Pave{ }.longueur + 1
DCT_Pave{ }.hauteur = DCT_Pave{ }.hauteur + 1
ENDPROC
retourne :
1 : un cube de 1 a un volume de 1
2: un cube de 4 a un volume de 64
3 : un cube de 8 a un volume de 512
Si le programme doit utiliser la même fonction personnalisée pour plusieurs structures de données, ayant la même structure de données, le BBC BASIC offre la possibilité de transmettre une structure de données par référence à ces fonctions personnalisées PROC et/ou FN,
DIM DCT_Pave{ largeur , longueur , hauteur }
DIM DCT_Cube{ } = DCT_Pave{ }
DIM DCT_Autre{ } = DCT_Pave{ }
DCT_Cube{ }.largeur = 4
DCT_Cube{ }.longueur = 4
DCT_Cube{ }.hauteur = 4
DCT_Autre{ }.largeur = 3
DCT_Autre{ }.longueur = 6
DCT_Autre{ }.hauteur = 2
PROC_Volume( DCT_Cube{ } )
PROC_Volume( DCT_Autre{ } )
END
REM --- Afficher les valeurs ---
DEF PROC_Volume( Q{ } )
kvolume = Q{ }.largeur * Q{ }.longueur * Q{ }.hauteur
PRINT "Ce pave a un volume de "; Q{ }.largeur * Q{ }.longueur * Q{ }.hauteur
ENDPROC
retourne :
Ce pave a un volume de 64
Ce pave a un volume de 36
STRUCTURES EXPORTÉES D'UNE FONCTION PERSONNALISÉE.
Dans une fonction personnalisée PROC et/ou FN, il est possible de déclarer une structure de données et de la pérenniser dans le module principal du programme, pour pouvoir le lire ou le modifier à volonté. Pour cela, il faut :
- de passer comme paramètre à la fonction un nom d'une structure de données non déclarée dans le module principal, et ;
- d'utiliser le mot-clé RETURN devant le nom de la variable associé à la structure non déclaré.
PROC_Type( DCT_TypeA{ } )
PROC_Type( DCT_TypeB{ } )
PROC_Type( DCT_TypeC{ } )
PRINT "distance : " ; DCT_TypeA{ }.distance ; " - vitesse : " ; DCT_TypeA{ }.vitesse ; " - duree : " ; DCT_TypeA{ }.duree
PRINT "distance : " ; DCT_TypeB{ }.distance ; " - vitesse : " ; DCT_TypeB{ }.vitesse ; " - duree : " ; DCT_TypeB{ }.duree
PRINT "distance : " ; DCT_TypeC{ }.distance ; " - vitesse : " ; DCT_TypeC{ }.vitesse ; " - duree : " ; DCT_TypeC{ }.duree
END
REM --- Tirage des cases gagnantes d'une grille ---
DEF PROC_Type( RETURN Q{ } )
DIM Q{ distance , vitesse , duree }
Q{ }.distance = RND( 100 ) + 100
Q{ }.vitesse = RND( 3 ) + 4
Q{ }.duree = Q{ }.distance / Q{ }.vitesse
ENDPROC
retourne :
distance : 144 - vitesse : 7 - duree : 20.5714286
distance : 155 - vitesse : 6 - duree : 25.8333333
distance : 145 - vitesse : 7 - duree : 24.1666667
STRUCTURE DE PORTÉE LOCALE DANS UNE FONCTION PERSONNALISÉE.
Si une fonction personnalisée PROC ou FN doit utiliser une structure de données de portée locale, c'est-à-dire que les valeurs de ses éléments ne doivent être exploitables qu'à l'intérieur de cette fonction personnalisée, sa déclaration devra y être faite après que son nom ait été spécifié avec le mot clé :
- LOCAL, si les valeurs des éléments doivent être perdues à la sortie de la fonction personnalisée ou ;
- PRIVATE, si les valeurs des éléments doivent être conservées pour une réutilisation dans la même fonction personnalisée.
DIM DCT_Global{ distance , vitesse , duree }
DIM DCT_Local{ distance , vitesse , duree }
DIM DCT_Prive{ distance , vitesse , duree }
DCT_Global{ }.distance = 125
DCT_Local{ }.distance = DCT_Global{ }.distance
PRINT DCT_Prive{ }.distance ; " - " ; DCT_Global{ }.distance ; " - " ; DCT_Local{ }.distance
FOR ktour = 1 TO 3 : PROC_Test : NEXT ktour
PRINT DCT_Prive{ }.distance ; " - " ; DCT_Global{ }.distance ; " - " ; DCT_Local{ }.distance
END
DEF PROC_Test
LOCAL DCT_Local{ }
PRIVATE DCT_Prive{ }
DIM DCT_Local{ distance , vitesse , duree }
DIM DCT_Prive{ distance , vitesse , duree }
DCT_Local{ }.distance = 456
DCT_Prive{ }.distance = DCT_Prive{ }.distance + 40
PRINT DCT_Prive{ }.distance ; " - " ; DCT_Global{ }.distance ; " - " ; DCT_Local{ }.distance
DCT_Local{ }.distance = 321
DCT_Global{ }.distance = 225
ENDPROC
retourne :
0 - 125 - 125
40 - 125 - 456
80 - 125 - 456
120 - 125 - 456
0 - 125 - 125
Les modifications de DCT_Global{ } sont conservées dans le module principal et dans PROC_Test.
Les modifications de DCT_Local{ } dans PROC_Test sont perdues, mais sa valeur dans le module principal est conservée.
Les modifications de DCT_Prive{ } dans PROC_Test sont conservées, mais sa valeur dans le module principal est différente.
Voir l'instruction DIM pour créer un tableau de données.
Voir l'instruction DIM() qui retourne le nombre de dimensions d'un tableau ou d'une de ses dimensions.
Voir l'instruction LOCAL pour déclarer des variables de portée locale dans une fonction personnalisée PROC ou FN.
Voir l'instruction PRIVATE pour déclarer des variables à usage privé dans une fonction personnalisée PROC ou FN.
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de
Dans la RETROGICIEL vous trouvez des suggestions simples et classiques pour
TESTER - DÉCOUVRIR - PRATIQUER - APPROFONDIR - EXPLORER
avec un exemple de résolution à télécharger pour vous inspirer.