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 :

[Débutant] Recherche d'erreur dans un code


Sujet :

Fortran

  1. #1
    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 [Débutant] Recherche d'erreur dans un code
    Bonjour,
    je suis en train d'écrire un programme pour calculer C_{n}^{p}
    J'ai eu 2 erreurs mais je n'arrive pas à m'en débarasser, pouvez-vous m'aider ?

    Voilà mon programme :
    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
    program expo
    implicit none
    integer n,p
    real sum, COMBI,comb
    print* ,'entrer le nombre n:'
    read*,n
    print* ,'entrer le nombre p'
    read*,p
    COMBI=comb(n,p)
    print *, COMBI
    end
     
    function fact(m)
    real fact
    integer  m, p
    p = 1
          do i = 1, m
             p = p * i
          end do
    fact = p
    end
     
    function comb(n,p)
    real comp
    integer n,p
    real q
     q=fact(n)/(fact(p)*fact(n-p))
    comp=q
    end
    Je rappelle C_{n}^{p}=n!/(p!.(n-p)!
    Merci pour votre aide

  2. #2
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    quel est le message d'erreur?

    pourquoi tu n'utilise pas des double precision (ou même quadruple precision) les factorielles sont rapidement très grosses.... essaye juste d'écrire factorielle 20 déjà et tu va rire!!!

    je crois qu'il y a d'autres algo pour touver le nombre de combinaisons; et il ne faut pas passé par les factorielles mais par le triangle de pascal, en gros on définit les combi par récurence.
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  3. #3
    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
    Question d'insister : Quel est le message d'erreur ?

    En plus de ce qu'a dit genteur slayer, le "implicit none" doit être répété à chaque programme, fonction et subroutine. Quand je l'ajoute après function fact(m) et après function comb(n,p), j'obtiens 3 erreurs et 1 avertissement...

  4. #4
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    un petit rajout:

    dans la fonction fact, le "i" n'est jamais défini... on sait pas ce que c de plus, fact n'est pas un real, mais un integer (bon c pas trop grave), question d'économie de mémoire, pas besoin de la variable p:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    integer(kind=8) function fact(m) !pour le kind, je te conseil le max que ton compilo supporte
      implicit none
      integer,intent(in) :: m !pour etre sûr de pas le modifié dans la fonction
      integer i;
        fact=1
        do i=2,m   !pas besoin de commencer à 1, à causs de la ligne precedente
          fact=facf*i
        end do
      return      !trèèèèèèèès important, faut retourné la valeur de fact!!!!
    end function fact
    ensuite, dans la fonction combi, elle doit elle aussi retourné une valeur (donc fo bien collé sont "return"
    de plus tu as confondu comp et comb.... pas malin
    enfin, le nombre de combi est un entier, pas un reel!!!

    donc si tu veux le faire avec la formule des factorielles (pas conseillé du tout) cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    integer function comb(n,p)
      implicit none
      integer,intent(in) :: n,p
        comb=fact(n)/(fact(p)*fact(n-p))
      return
    end function comb
    enfin, dans ton prog principal, ne déclare pas de real comb alors que tu as une fonction qui a déjà ce nom, ce n'est pas une faute de language, c'est parfaitement autorisé (tout comme appeler un reel "if" par exemple) mais c fortement déconseillé car tu sais plus qui est quoi....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    program expo
      implicit none
      integer n,p combi
        print * ,'entrer le nombre n:'
        read *,n
        print * ,'entrer le nombre p'
        read *,p
        COMBI=comb(n,p)
        print *, COMBI
    end program expo
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  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
    Bonsoir,
    Merci pour vos reponses,
    mais je ne comprends pas le role de return, pourquoi c est tres important de le mettre?

  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
    Le return est facultatif dans la mesure où il y a implicitement un return sur le end. Le return est requis quand on veut sortir avant la fin d'une fonction ou d'une routine. Tu peux donc les omettre dans ton programme.

  7. #7
    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
    Bonsoir,
    J ai essaye le programme , mais dans la compilation j ai 2 erreurs :
    voila mon programme :
    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
    program expo
      implicit none
      integer n,p, combi
        print * ,'entrer le nombre n:'
        read *,n
        print * ,'entrer le nombre p'
        read *,p
        COMBI=comb(n,p)
        print *, COMBI
    end program expo
     
    integer function fact(m) !pour le kind, je te conseil le max que ton compilo supporte
      implicit none
      integer,intent(in) :: m !pour etre sûr de pas le modifié dans la fonction
      integer i;
        fact=1
        do i=2,m   !pas besoin de commencer à 1, à causs de la ligne precedente
          fact=fact*i
        end do
      return      !trèèèèèèèès important, faut retourné la valeur de fact!!!!
    end function fact
     
    integer function comb(n,p)
     implicit none
      integer,intent(in) :: n,p
        comb=fact(n)/(fact(p)*fact(n-p))
      return
    end function comb

    COMB must appear in a type declaration because implicit none has been used.
    alors comment faire?
    merci

  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
    Dans les units utilisant des fonctions externes, tu dois déclarer ces fonctions externes. Tu dois donc ajouter des lignes du genre :

    « Type », external :: NomDeLaFonction

    Ton programme devient donc :
    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
    program expo
    implicit none
    integer n,p, combi
    integer, external :: comb
    print * ,'entrer le nombre n:'
    read *,n
    print * ,'entrer le nombre p'
    read *,p
    COMBI=comb(n,p)
    print *, COMBI
    end program expo
     
    integer function fact(m) !pour le kind, je te conseil le max que ton compilo supporte
    implicit none
    integer,intent(in) :: m !pour etre sûr de pas le modifié dans la fonction
    integer i;
    fact=1
    do i=2,m !pas besoin de commencer à 1, à causs de la ligne precedente
    fact=fact*i
    end do
    return !trèèèèèèèès important, faut retourné la valeur de fact!!!!
    end function fact
     
    integer function comb(n,p)
    implicit none
    integer,intent(in) :: n,p
    integer, external :: fact
    comb=fact(n)/(fact(p)*fact(n-p))
    return
    end function comb
    La méthode alternative (que j'utilise toujours) est d'utiliser un module :
    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
     
    module Factoriels
      implicit none
      private
      public fact,comb
    contains
     
      integer function fact(m) 
        integer,intent(in) :: m
        integer i;
        fact=1
        do i=2,m !pas besoin de commencer à 1, à causs de la ligne precedente
          fact=fact*i
        end do
        end function fact
     
      integer function comb(n,p)
        integer,intent(in) :: n,p
        comb=fact(n)/(fact(p)*fact(n-p))
        end function comb
     
    end module
     
    program expo
    use Factoriels
    implicit none
    integer n,p, combi
    print * ,'entrer le nombre n:'
    read *,n
    print * ,'entrer le nombre p'
    read *,p
    COMBI=comb(n,p)
    print *, COMBI
    end program expo
    Avec le module, il y a validation automatique des arguments, des types, etc. Le retour est très rapide pour les 3 minutes investies...

Discussions similaires

  1. recherche d'erreur dans un code
    Par saida29 dans le forum Fortran
    Réponses: 1
    Dernier message: 25/05/2013, 12h14
  2. [Débutant] trouver les erreurs dans un code
    Par rouliane dans le forum C++
    Réponses: 11
    Dernier message: 26/01/2008, 13h47
  3. Réponses: 4
    Dernier message: 10/08/2006, 14h44
  4. [VBA][Débutant][export]erreurs dans mon code?
    Par Christophe93250 dans le forum Access
    Réponses: 4
    Dernier message: 06/01/2006, 20h52
  5. [VBA] Erreur dans un code. Hierarchie DAO.
    Par snoopy69 dans le forum VBA Access
    Réponses: 3
    Dernier message: 22/10/2005, 23h28

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