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 :

Appel d'un tableau


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2010
    Messages : 7
    Par défaut Appel d'un tableau
    Bonjour,

    Je viens requérir votre aide car dans le cadre de mon cursus scolaire, on me demande de réaliser un programme en FORTRAN90. Une bonne partie de mon programme est écrit mais j'ai un problème. En fait mon programme est constitué du dit programme et d'un sous programme. Ma question est de savoir comment utiliser un tableau crée dans mon programme principal dans mon sous programme?

    Merci d'avance de vos réponses.

  2. #2
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Bonjour,

    En fortran chaque programme ou sous programme est indépendant, donc tu dois faire communiquer tes sous programmes en passant les variables de l'un à l'autre. Tu as plusieurs possibilités. Dans ton cas (1 seul sous programme et 1 tableau à transférer) l'utilisation d'arguments à ta subroutine semble le plus simple.

    à voir dans la FAQ : ici

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2010
    Messages : 7
    Par défaut précision
    Tout d'abord, merci d'avance de votre réponse.

    En fait je n'ais pas vraiment bien décris mon problème. Je vais donc essayer de l'expliciter en vous écrivant une partie de mon code. De plus je précise que lors de la compilation je n'ai aucun problème mais lorsque je lance mon programme après avoir entré mes paramètres j ai une " ERREUR SEGMENTATION " qui s'affiche. Je me suis renseigné et il semblerais que ce soit du au fait que mon tableau accède à une partie de la mémoire qui ne lui ait pas autorisé....

    voici une partie de mon code:

    PROGRAM PG

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    IMPLICIT NONE
    INTEGER(KIND=8)   :: i, n, j
    REAL(KIND=8), ALLOCATABLE, DIMENSION( : )   :: x, y, m
    REAL(KIND=8) :: tmax, t
    READ*, tmax, t
    READ*, n
    ALLOCATE(x(1:n), y(1:n), m(1:n))
    DO i=1, n
    READ*, x(i), y(i), m(i)
    END DO
    DO WHILE(t<=tmax)
    DO j=1, n
    call TESTE( x(j), y(j), vx(j), vy(j), m(j), N, t, j)
    END DO
    t=t+h
    PRINT*,'&'
    END DO
    DEALLOCATE(x, y, m)
    END PG
     
    SUBROUTINE TESTE(x, y, m, n, t, j)
    IMPLICIT NONE
    INTEGER(KIND=8)   :: i, n, j,
    REAL(KIND=8)   :: t
    REAL(KIND=8), DIMENSION( : )   :: x, y, m
    REAL(KIND=8), ALLOCATABLE, DIMENSION( : )   :: rx, ry
    REAL(KIND=8), ALLOCATABLE, DIMENSION( : )   :: r
     
     
    ALLOCATE(rx(1:n), ry(1:n))
    DO i=1, n
        rx(i)=x(i)-x(j)
        ry(i)=y(i)-y(j)
     
    END DO
    END SUBROUTINE TESTE
    Merci d'avance de vos réponses.

    NB: J'ai supprimé une bonne partie de mon programme qui n'est pas en cause dans mon problème.

  4. #4
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Bonjour

    Ton code semble pas mal (pense à l'indenter c'est plus facile à lire). Par contre il y a une erreur lié au tableau qui doit être l'origine du problème. Tu ne peux pas déclarer des tableaux allocatable dans une subroutine (en fait oui j'expliquerai plus bas). Dans ton programme principal tu alloue tes tableaux et dans les sous programmes il faut qu'il soit statique. Donc tu dois transférer à ta subroutine les dimensions des tableaux et tu déclare alors les tableaux avec la bonne dimension. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    program exemple
      implicit none
     
      integer :: dim, i
      real(kind=8), dimension(:), allocatable :: tab      ! dynamique
     
      write(*,"('dim ?')")
      read(*,*) dim
      write(*,"('dim = ', i12)") dim
     
      allocate( tab(1:dim) )
     
      do i=1,dim
        tab(i) = dble(i**2)
      end do
     
      call print( dim, tab)
     
    end program exemple
     
    !* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
     
    subroutine print( dim, tab)
      implicit none
     
      ! arguments :
      integer, intent(in) :: dim            ! intent(in) est nécessaire pour utiliser dim
                                            ! comme dimension
      real(kind=8), dimension(dim), intent(in) :: tab       ! statique
     
      ! local :
      integer :: i
     
      do i=1,dim
        write(*,*)i,tab(i)
      end do
     
    end subroutine print
    Il est très utile de précisé dans la déclaration des arguments s'il s'agit d'arguement d'entré intent(in), de sortie intent(ou) ou les deux (inout). Le compilateur peut vérifier ce que tu fais avec tes arguments et ça simplifie la lecture. Ici, il faut dire que dim est un argument d'entré (donc nom modifiable) pour avoir le droit de l'utiliser pour déclarer la dimension.

    Pour faire un allocate dans une subroutine il faut utiliser les modules (F90 et suivant uniquement). Si un tableau est déclaré dans un module alors il peut être alloué dans une subroutine qui est contenu dans ce module.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2010
    Messages : 7
    Par défaut allocation tableau subroutine
    Merci beaucoup, j'ai comme vous me l'avez dit donné les dimensions de mon tableau dans ma subroutine, et depuis plus aucun problème.

    Encore merci car j'ai passé énormément de temps à rechercher comment résoudre cette erreur!!!

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

Discussions similaires

  1. Remplissage et appel d'un tableau de String
    Par HackerNet dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 01/11/2013, 18h17
  2. [Vb6] Appel d'un Tableau dans une requete SQL
    Par Netzo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/07/2010, 09h57
  3. Réflection : Appel constructeur avec tableau de classe
    Par JohnNC dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 30/12/2009, 10h46
  4. [langage] appel d'un tableau dans une fonction
    Par donny dans le forum Langage
    Réponses: 11
    Dernier message: 13/11/2006, 16h17
  5. Appel d'une fonction dans uns boucle d'un tableau
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/02/2005, 15h37

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