Bonjour,
Je cherche un moyen de créer un tableau A(i,j) dont la dismension de j est fonction de i en fortran 90.
Un exemple pour être plus précis :
dimension (A(:,1)) = 10
dimension (A(:,2)) = 20
Merci
Bonjour,
Je cherche un moyen de créer un tableau A(i,j) dont la dismension de j est fonction de i en fortran 90.
Un exemple pour être plus précis :
dimension (A(:,1)) = 10
dimension (A(:,2)) = 20
Merci
Salut!
Donc un tableau bidimensionnel dont les lignes n'ont pas toutes la même longueur.la dismension de j est fonction de i
Comme je ne connais pas très bien le Fortran 90, je ne peux pas te répondre. En Fortran 77, un tableau bidimensionnel doit être rectangulaire, mais il y a des astuces pour contourner la difficulté.
Jean-Marc Blanc
Deux possibilités :
1. Soit tu créé ton tableau de la taille maximale possible (ie ton 'i' maximum), mais ce n'est pas du tout optimisé et cela peut te saturer ta mémoire
2. Soit tu utilises un type dérivé du genre :
Avec VALEUR un tableau comprenant la taille des sous-tableaux que tu veux affecter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 TYPE TABLEAU_BISCORNU REAL(KIND=8), allocatable, dimension(:) :: TABLEAU_FILS END TYPE TABLEAU_BISCORNU TYPE(TABLEAU_BISCORNU), allocatable, dimension(:) :: TABLEAU_PARENT ALLOCATE(TABLEAU_PARENT(J)) DO K=1,J ALLOCATE(TABLEAU_PARENT(K)%TABLEAU_FILS(VALEUR(K))) END DO
Ensuite, pour 'remplir' les cases d'une structure, il te faut faire :
par exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TABLEAU_PARENT(IDX)%TABLEAU_FILS(:)=1d0
En espérant avoir répondu à ta question,
Marlan
À ma connaissance, la solution avec type dérivé est la seule possible parce que Fortran ne permet pas de déclarer un tableau de pointeurs.
Ton code sera malheureusement difficile à lire. TableauParent(i)%TableauFils(j) est nettement moins intuitif que Tableau(i,j). Tu pourrais utiliser des noms près de l'usage, comme Tableau_Lig(i)%Col(j) pour aider le lecteur.
À moins que tu aies un compilateur pure F95, favorise le membre allocatable plutôt que pointer (seul permis en F95 standard). Ton code sera plus robuste.
Salut!
Il y a une solution quand la matrice est triangulaire. Dans la bibliothèque LinPack, compare les routines SPPSL (stockage de la matrice dans un tableau dont la moitié n'est pas utilisée) et SPOSL (stockage bout à bout dans un tableau à une seule dimension). Je pense qu'il est possible de généraliser le stockage bout à bout en ajoutant un tableau indiquant où commence chaque ligne.
Jean-Marc Blanc
Bonjour,
Oui c'est exactement ça.Envoyé par FR119492
Bon je pense avoir trouvé une solution temporaire à mon problème en faisant un tableau de structures, comme ceci :
Ainsi je peux allouer la dimension que je souhaite à MonTab, puis chaque élément de MonTab est une structure qui contient un tableau dynamique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 type TAB real(kind=8), dimension(:) , pointer :: T integer(kind=4) :: n end type TAB program TEST implicit none type(TAB) , dimension(:), allocatable :: MonTab end TEST
Néanmoins si quelqu'un a une solution plus simple, je suis preneur
Partager