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 :

Problème de fonctions


Sujet :

Fortran

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème de fonctions
    Bonjour j'ai un souci avec mon code Fortran pour un Jeu De Vie.

    Mon soucis est que j'ai la matrice 3*3 suivante :

    1 0 0
    1 1 0
    0 0 1

    Lorsque je passe ma fonction nb_voisins_vivants(i,j,G) sur la case de coordonnée i=1, j=1 j'obtiens bien 2 (voisins).

    Cependant dans ma fonction prochain_etat(i,j,G) qui rend la valeur d'une case a la génération suivante, lorsque je PRINT la valeur de nb_voisins_vivants(i,j,G) avec toujours i=1 et j=1 j'obtiens 5 !!!


    Puis si je boucle la fonction et que je continue avec les mêmes coordonnées il me donne 11 puis 17 ... (+6 a chaque fois)
    Je ne comprends pas pourquoi ?
    Y aurait-il un problème avec ma fonction nb_voisins_vivants(i,j,G) ?

    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
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
    INTEGER FUNCTION prochain_etat(i,j,G)
    INTEGER, DIMENSION(:,:),INTENT(INOUT) :: G
    INTEGER, INTENT(INOUT) :: i,j
     
     
    IF (G(i,j)==1) THEN
    PRINT*, nb_voisins_vivants(i,j,G)
       IF (nb_voisins_vivants(i,j,G)==2 .OR. nb_voisins_vivants(i,j,G)==3) THEN
          prochain_etat=1
       ELSE
          prochain_etat=0
       END IF
    ELSE
       IF (nb_voisins_vivants(i,j,G)==3) THEN
          prochain_etat=1
       ELSE
          prochain_etat=0
       END IF
    END IF
     
    END FUNCTION prochain_etat
     
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Merci d'avance pour votre aide.
    J'ai joins mon fichier *.f90 dans le zip pour que vous voyez un peu ce que j'ai fais.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut variable statique
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INTEGER FUNCTION nb_voisins_vivants(i,j,G)
    INTEGER, DIMENSION(:,:),INTENT(INOUT) :: G
    INTEGER, INTENT(INOUT) :: i,j
    INTEGER :: s=0, f, jbis,z,a,b
    En FORTRAN 90, s est une variable statique.
    La fonction nb_voisins_vivants l'incrémente bien de 2 à chaque appel.
    Comme elle est appelée 3 fois par prochain_etat dans la boucle, ça explique le +6.

    Sinon, il y aurait des choses à redire sur le code.
    Dans nb_voisins_vivants, les variables i et j servent à la fois à repérer la case et à faire la somme.

    Et le code serait plus clair en utilisant des ELSEIF.

    Tu peux utiliser avantageusement les fonctions intrinsèques du FORTRAN 90 (where, sum …).

    Si tu ne vois toujours pas, utilise un débogueur pour faire du pas à pas.

    Bon courage.

  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
    Pour compléter :
    Citation Envoyé par __dardanos__ Voir le message
    En FORTRAN 90, s est une variable statique.
    La fonction nb_voisins_vivants l'incrémente bien de 2 à chaque appel.
    Comme elle est appelée 3 fois par prochain_etat dans la boucle, ça explique le +6.
    L'initialisation à zéro est bien effectuée, mais une seule fois au démarrage du programme. Pour que la mise à zéro s'effectue à chaque appel, tu dois avoir une instruction s = 0 dans la section « exécutable » et non dans les déclarations.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses.

    Donc j'ai rajouter :

    s=0

    a la fin de ma fonction nb_voisins_vivants.

    Mais maintenant j'ai un problème avec la fonction prochain_etat qui me renvoie 0 a la place de 1 pour la case i=2, j=2.

    Pourtant il y'a bien 3 voisin a la case (2,2) donc il devrait me renvoyer 1 :/

    Après je confirme que le code est encore un peu brouillon vu que je viens de le commencer. Il y'a plein de variables ou de test inutile mais qui me serve a la résolution de problème vu que je n'ai pas de débogueur.

Discussions similaires

  1. C++ Problème de fonctions et pointeurs
    Par zmatz dans le forum C++
    Réponses: 3
    Dernier message: 01/10/2005, 16h20
  2. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  3. Problème de fonction
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/05/2005, 20h30
  4. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  5. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52

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