IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Créer un tableau à 2 dimensions dépendantes


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur modélisation aérodynamique
    Inscrit en
    Juillet 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur modélisation aérodynamique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 105
    Par défaut Créer un tableau à 2 dimensions dépendantes
    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

  2. #2
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    Salut!
    la dismension de j est fonction de i
    Donc un tableau bidimensionnel dont les lignes n'ont pas toutes la même longueur.

    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

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Par défaut
    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 :

    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
    Avec VALEUR un tableau comprenant la taille des sous-tableaux que tu veux affecter.

    Ensuite, pour 'remplir' les cases d'une structure, il te faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TABLEAU_PARENT(IDX)%TABLEAU_FILS(:)=1d0
    par exemple.

    En espérant avoir répondu à ta question,

    Marlan

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    À 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.

  5. #5
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Par défaut
    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

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    ...Je pense qu'il est possible de généraliser le stockage bout à bout en ajoutant un tableau indiquant où commence chaque ligne.
    Je n'y avais pas pensé, mais tu as raison. Il suffit d'avoir un tableau à un dimension de la longueur totale, et d'avoir une fonction qui calcule le déplacement. On a alors des expressions du genre Tableau(Idx(i,j)) où Idx() est la fonction de calcul du déplacement.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur modélisation aérodynamique
    Inscrit en
    Juillet 2009
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur modélisation aérodynamique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 105
    Par défaut
    Bonjour,

    Citation Envoyé par FR119492
    Donc un tableau bidimensionnel dont les lignes n'ont pas toutes la même longueur.
    Oui c'est exactement ça.

    Bon je pense avoir trouvé une solution temporaire à mon problème en faisant un tableau de structures, comme ceci :

    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
    Ainsi je peux allouer la dimension que je souhaite à MonTab, puis chaque élément de MonTab est une structure qui contient un tableau dynamique.

    Néanmoins si quelqu'un a une solution plus simple, je suis preneur

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer un tableau à deux dimensions dynamique
    Par dev14 dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2012, 09h12
  2. Réponses: 0
    Dernier message: 27/04/2010, 16h40
  3. Comment créer et parcourir un tableau à deux dimensions en java SE
    Par Invité dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 25/02/2009, 11h07
  4. créer un tableau 2 dimensions avec Malloc
    Par nimportekoi dans le forum C
    Réponses: 14
    Dernier message: 15/11/2006, 13h01
  5. Réponses: 27
    Dernier message: 19/04/2006, 17h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo