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 :

[Fortran 77] Fonction qui rend un tableau ? Produit matrice vecteur


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 10
    Points
    10
    Par défaut [Fortran 77] Fonction qui rend un tableau ? Produit matrice vecteur
    Bonjour,

    Je suis débutant dans en Fortran, et j'aimerais savoir si une fonction en Fortran 77 peut rendre un tableau?

    Mon cas est le suivant: j'ai une fonction qui fait le produit Matrice (M) Vecteur (X), de dimension (dim), et me rend un vecteur MX. Lors de la compilation j'ai l'erreur suivante:

    FUNCTION MX(M,X, dim)
    ...............1................

    Si j'ai bien compris le compilateur n'aime pas trop le nom de ma fonction... il y a quelquechose qui cloche. J'ai tout essayé (changé de nom, vérification des types ...) mais je ne trouve pas. Mon code:

    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
          FUNCTION MX(M,X, dim)
          REAL*8 MX
          INTEGER dim
          REAL*8 M(dim, dim), X(dim)
          INTEGER i,j
     
          DO i =1,dim
          MX(i)=0.d0
            DO j=1, dim
              MX(i)= MX(i) + M(i,j)*X(j)
            ENDDO
          ENDDO
     
          RETURN
          END
    J'ai donc conclu qu'une fonction ne peut pas rendre un tableau. J'ai déjà fais du C, et la notion de pointeur m'est venu à l'esprit...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Points : 594
    Points
    594
    Par défaut
    Bonjour,

    Si tu comptes en rester au Fortran 77 (pourquoi?), tu devrais utiliser une subroutine (en Fortran, contrairement au C, les routines travaillent sur les variables et non pas des copies):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
          subroutine produitMV(M,X, MX,dim)
          implicit none
          INTEGER dim
          REAL*8 M(dim, dim), X(dim),MX(dim)
    c
    ... tes calculs ici
    c
          end
    Bonne continuation.

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

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Points : 982
    Points
    982
    Par défaut
    Salut

    Petite remarque sur le 77 et le 90 : si tu passes au 90 il existe une fonction toute faite qui fait un produit de matrice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VEC(:) = matmul( A(:,:) , U(:) )
    Plus besoin de la programmer et en plus dans un même programme de fortran 90 tu peux très bien avoir des bout en 77 ça ne gène pas la compilation.

    Ceci dis en fortran tu as 2 sous programmes :
    SUBROUTINE
    FUNCTION

    La fonction sert à renvoyer une valeur (comme cosinus par exemple) stockée dans le nom de la fonction. La subroutine fait tout le reste. Elle renvoit rien ou plusieurs valeurs (dans ses arguments). C'est pour ça que ça marche pas, même si ton vecteur est une seule variable tu peux pas déclarer une fonction avec une dimension !

  4. #4
    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
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut !

    rester au Fortran 77 (pourquoi?)
    Pourquoi pas ?

    Jean-Marc Blanc

  5. #5
    Débutant
    Inscrit en
    Juillet 2007
    Messages
    386
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 386
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par hammah Voir le message
    Mon code:

    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
          FUNCTION MX(M,X, dim)
          REAL*8 MX
          INTEGER dim
          REAL*8 M(dim, dim), X(dim)
          INTEGER i,j
     
          DO i =1,dim
          MX(i)=0.d0
            DO j=1, dim
              MX(i)= MX(i) + M(i,j)*X(j)
            ENDDO
          ENDDO
     
          RETURN
          END
    Il ne faut pas mettre le nom de ton tableau analogue au nom de ta fonction, tu appelle ta fonction autrement par exemple Produit(M,X,dim) et ensuite tu ecrit :
    A mon avis les subroutines sont mieux

  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
    Points : 1 346
    Points
    1 346
    Par défaut
    Citation Envoyé par hammah Voir le message
    Bonjour,

    Je suis débutant dans en Fortran, et j'aimerais savoir si une fonction en Fortran 77 peut rendre un tableau?
    Non. Comme d'autre l'on dit, si tu dois te limiter à du F77, tu dois utiliser une subroutine.
    Citation Envoyé par hammah Voir le message
    Mon cas est le suivant: j'ai une fonction qui fait le produit Matrice (M) Vecteur (X), de dimension (dim), et me rend un vecteur MX. Lors de la compilation j'ai l'erreur suivante:

    FUNCTION MX(M,X, dim)
    ...............1................

    Si j'ai bien compris le compilateur n'aime pas trop le nom de ma fonction... il y a quelquechose qui cloche. J'ai tout essayé (changé de nom, vérification des types ...) mais je ne trouve pas. Mon code:

    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
          FUNCTION MX(M,X, dim)
          REAL*8 MX
          INTEGER dim
          REAL*8 M(dim, dim), X(dim)
          INTEGER i,j
     
          DO i =1,dim
          MX(i)=0.d0
            DO j=1, dim
              MX(i)= MX(i) + M(i,j)*X(j)
            ENDDO
          ENDDO
     
          RETURN
          END
    J'ai donc conclu qu'une fonction ne peut pas rendre un tableau. J'ai déjà fais du C, et la notion de pointeur m'est venu à l'esprit...
    Comme dit par d'autre, cette fonction est native en F90. Toujours en F90, tu peux cependant l'écrire toi-même. Elle aura la forme :
    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
     
    function MX(M,X)
       real M(:,:)
       real X(:)
       real MX(size(X))
     
          INTEGER dim
          INTEGER i,j
     
          dim = size(X)
          DO i =1,dim
          MX(i)=0.d0
            DO j=1, dim
              MX(i)= MX(i) + M(i,j)*X(j)
            ENDDO
          ENDDO
     
          RETURN
          END

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Merci pour les réponses.

    En fait, je commence avec le Fortran 77, et une fois que j'ai compris comment tout ça marche, je passe au Fortran 90.

    J'ai finalement utilisé une subroutine, et ça marche. je croyais avoir tout compris sur les subroutines et les fonctions, mais ce n'était évidemment pas le cas... ça l'est maintenant.

    Encore merci!

    le code qui marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SUBROUTINE MX(M,X,Y, dim)
          INTEGER dim
          REAL*8 M(dim, dim), X(dim), Y(dim)
          INTEGER i,j
     
          DO i =1,dim
          Y(i)=0.d0
            DO j=1, dim
              Y(i)= Y(i) + M(i,j)*X(j)
            ENDDO
          ENDDO
     
          RETURN
          END

  8. #8
    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
    Points : 1 346
    Points
    1 346
    Par défaut
    Citation Envoyé par hammah Voir le message
    ...je commence avec le Fortran 77, et une fois que j'ai compris comment tout ça marche, je passe au Fortran 90...
    Il est à mon avis beaucoup plus facile de commencer en F90 avec des fonctions et routines « contains » à cause des interfaces automatiques qui simplifient beaucoup beaucoup le débogage.

    Ensuite, on peut passer à F77.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Points : 594
    Points
    594
    Par défaut
    Je pense de même qu'il vaut mieux commencer par du Fortran 90 puis s'intéresser au "sous-ensemble" qu'est le Fortran 77; ou éventuellement attaquer les deux simultanément.
    Si le but final est de faire du Fortran 90, je te conseille de ne pas trop t'attarder sur le 77.

    Citation Envoyé par FR119492
    rester au Fortran 77 (pourquoi?)
    Pourquoi pas ?
    Mouais, et pourquoi pas du Fortran 66 (voir du Fortran IV) ?

  10. #10
    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
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut !

    pourquoi pas du Fortran 66
    T'en fais pas, Ehouarn, par ordre chronologique, le Fortran II n'a été que le troisième langage avec lequel j'ai travaillé (READ INPUT FILE, etc.).

    Pour répondre plus directement à la question, parce qu'il existe une masse de bibliothèques de calcul écrites en Fortran 77 et qui ont l'avantage d'être anciennes, donc nettoyées de tous les bogues qu'elles pouvaient contenir initialement.

    Une idée serait que Developpez.com initie une campagne de tests comparatifs pour la vitesse d'exécution de divers algorithmes de calcul numérique (systèmes linéaires, équations différentielles ordinaires, etc.) programmés en différents langages. Personnellement, je serais partant, et on verra ce qu'on verra.

    Jean-Marc Blanc

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Points : 594
    Points
    594
    Par défaut
    Ta réponse ne tient pas Jean-Marc; un programme Fortran 90 peut faire appel à des librairies Fortan 77. En déduire qu'il faut donc travailler en Fortran 77 relève du mauvais syllogisme.

    Pour ce qui est d'une campagne comparative; c'est à mon avis simplement impossible et donc bien futile. Comment définir la 'vitesse' d'un programme d'un langage donnée alors que tant dépend du compilateur et de la plateforme sur laquelle on tourne ?

    Ehouarn

  12. #12
    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
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut Ehouarn !

    'vitesse' d'un programme d'un langage donnée alors que tant dépend du compilateur et de la plateforme
    Il est bien clair que des tests effectués sur ces machines différentes ne sont pas comparables. Il serait indispensable de transférer soit tous les sources, soit tous les .exe sur la même machine.

    un programme Fortran 90 peut faire appel à des librairies Fortan 77
    Pratiquement, c'est ce que je fais, en particulier pour utiliser le format EN. L'allocation dynamique constitue une autre raison. Mais, pour des raisons d'habitude, je préfère le format fixe.

    Jean-Marc Blanc

  13. #13
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut function renvoyant une matrice (vecteur colonne)
    Voici un exemple .Tourne sur compilteur Silverfrost Fnt95 et Compaq Visual Fortran 6.6.
    Ceci pour montrer que Fortran permet autant que le C ou VB.
    Bon courage pour les "Fortraners".
    De la à dire qu' il faut utiliser un "subroutine"


    PROGRAM MAIN
    REAL, DIMENSION(2) :: V, W
    REAL, DIMENSION(2,2) :: A

    REAL, DIMENSION(2) :: T, U
    REAL, DIMENSION(2,2) :: B

    !exemple 1-remplit V & A
    W(1)=0.0
    W(2)=0.0
    A(1,1)=1.
    A(1,2)=2.
    A(2,1)=3.
    A(2,2)=4.
    V(1)=1.
    V(2)=2.
    !exemple 2-remplit T & B
    B(1,1)=2.
    B(1,2)=4.
    B(2,1)=6.
    B(2,2)=8.
    T(1)=0.0
    T(2)=0.0
    U(1)=1.
    U(2)=2.

    ! print *, W ! imprime colonnes
    W= MatrixVector(A, V)
    DO J=1,2
    PRINT *, "W = ", W(J)
    END DO
    PAUSE
    ! print *, T ! imprime colonnes
    T = MatrixVector(B, U)
    DO J=1,2
    PRINT *, "T = ", T(J)
    END DO
    PAUSE
    CONTAINS

    FUNCTION MatrixVector(M, X)
    REAL, DIMENSION(:, :: M
    REAL, DIMENSION( :: X
    INTEGER ::N,I,J
    REAL :: MatrixVector(SIZE(X))

    N=SIZE(X)
    DO I=1, N
    MatrixVector(I)=0.
    DO J=1, N
    MatrixVector(I) = MatrixVector(I) + M(I,J)*X(J)
    ENDDO
    ENDDO
    ! print *,MatrixVector ! imprime colonnes

    DO J=1,2
    PRINT *, "Function MatrixVector = ", MatrixVector(J)
    END DO
    PAUSE
    RETURN
    END FUNCTION MatrixVector

    END PROGRAM MAIN

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

Discussions similaires

  1. Fonction qui rend un pointeur
    Par WaM dans le forum C
    Réponses: 6
    Dernier message: 20/05/2006, 20h31
  2. [VB] Fonction qui retourne un tableau
    Par ptitsoleil87 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 24/12/2005, 11h52
  3. Fonction qui renvoie un tableau?
    Par elm dans le forum C
    Réponses: 23
    Dernier message: 21/12/2005, 13h44
  4. Fonction qui rend nul le bouton d'alimentation ?
    Par rpoulin dans le forum Langage
    Réponses: 7
    Dernier message: 09/10/2005, 06h03
  5. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 16h06

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