Suiv.: 3.4 Programmation avec les tableaux dynamiques
Sup.: 3 Tableaux dynamiques
Préc.: Déclaration du super-tableau
Index
Table des matières
Les utilitaires sont décrits dans cette section par ordre alphabétique.
Essentiellement, le programmeur initialise le super-tableau à l'aide
de l'utilitaire INITIS (p. ), alloue des
tableaux dynamiques avec READRE, et les libère avec
TUER. L'unicité du nom de chaque tableau (paramètre TAB)
est à la charge du programmeur.
|
SUBROUTINE IMATAB(
)
INTEGER M(*)
Cet utilitaire imprime la liste de tous les tableaux dynamiques alloués dans M.
SUBROUTINE MAXTAM(
,
,
)
INTEGER M(*), IATAB, LTAB
Cet utilitaire détermine la taille maximale pouvant être allouée.
Attention : MAXTAM ne réserve pas l'espace-mémoire trouvé. L'utilisation habituelle est de la forme suivante :
... C --- DETERMINER LA TAILLE MAXIMALE POUVANT ETRE ALLOUEE CALL MAXTAM(M, IATAB, LMAX) C --- ALLOUER UN TABLEAU DE TAILLE MAXIMALE NTYTAB = ... TAB = ... CALL READRE(NTYTAB, TAB, IATAB, LMAX, M, ICODE) C --- UTILISER CE TABLEAU ... C --- DETERMINER LA TAILLE EFFECTIVEMENT UTILISEE LTAB = ... C --- AJUSTER LA TAILLE DU TABLEAU CALL READRE(NTYTAB, TAB, IATAB, LTAB, M, ICODE) ...
Remarque : lorsque plusieurs tableaux de grande taille doivent être alloués, il est nécessaire d'appeler MAXTAM plusieurs fois :
... C ALLOUER DEUX GRANDS TABLEAUX DE TAILLES VOISINES CALL MAXTAM(M, IAT1, LMAX) CALL READRE(1, 'T1', IAT1, LMAX/2, M, ICODE) CALL MAXTAM(M, IAT2, LMAX) CALL READRE(2, 'T2', IAT2, LMAX, M, ICODE) ...
SUBROUTINE READRE(
,
,
,
,
,
)
INTEGER NTYTAB, IATAB, LTAB, M(*), ICODE
CHARACTER*(*) TAB
Cet utilitaire alloue un tableau (les éléments de ce tableau ne sont pas initialisés).
En sortie, ICODE vaut 1 si le tableau existait avec la même longueur et le même type, 0 sinon.
Si LTAB = 0, aucun tableau n'est alloué mais en sortie IATAB = 1. En effet, si IATAB n'était pas initialisé, le passage de M(IATAB) en paramètre pourrait déclencher une erreur d'exécution.
Si le super-tableau ne contient pas un tableau de même nom, l'allocation ne pose aucune difficulté. En revanche, si un tableau de même nom existe déjà, il est ``réalloué'' de la façon suivante :
Soient
NTYTAB le type demandé,
NTYTAB le type de l'ancien tableau,
LTAB la longueur demandée,
LTAB
la longueur de l'ancien tableau.
SUBROUTINE RENOMM(
,
,
,
,
)
CHARACTER*(*) ANCTAB, NOUTAB
INTEGER IATAB, LTAB, M(*)
Cet utilitaire renomme un tableau.
ANCTAB est l'ancien nom du tableau, NOUTAB le nouveau.
Attention : des erreurs sont possibles si ANCTAB et NOUTAB n'ont pas le même nombre de caractères.
SUBROUTINE TROUVE(
,
,
,
,
,
)
INTEGER NTYTAB, IATAB, LTAB, ICODE, M(*)
CHARACTER*(*) TAB
Cet utilitaire cherche un tableau d'après son nom.
S'il est trouvé, les paramètres de sortie sont mis à jour.
Sinon, en sortie.
Le paramètre ICODE est conservé pour compatibilité seulement.
Remarque : en principe, le programmeur doit conserver l'adresse IATAB retournée par READRE et éviter d'appeler TROUVE (mais ce n'est pas toujours possible !).
SUBROUTINE TUER(
,
)
CHARACTER*(*) TAB
INTEGER M(*)
Cet utilitaire libère un tableau (l'espace libéré devient disponible pour une nouvelle allocation). Par exemple, en fin de module, tous les tableaux de travail doivent être détruits de cette manière.
SUBROUTINE TYPCLA(
,
,
)
INTEGER NTYTAB, NM1, NM2
Cet utilitaire retourne en clair, sur les deux entiers NM1 et NM2 (imprimables en format Fortran 2A4), le type NTYTAB d'un tableau : ENTIER, REEL1MOT, LOGIQUE, CARACTER, REEL2MOT, COMPLEXE, COMPLEX2.
SUBROUTINE TYPMOT(
,
)
INTEGER NTYTAB, NBREMO
Cet utilitaire retourne le nombre de mots occupés par
un élément de tableau de type NTYTAB. Par exemple,
retourne
,
retourne
, ...