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 :

IF probleme Fortran ou codeblocs ?


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 93
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2014
    Messages : 12
    Points : 15
    Points
    15
    Par défaut IF probleme Fortran ou codeblocs ?
    Problème avec un IF fortran sous code blocs:
    Les faits: J'utilise" Implicit integer(I-N)" omme dans le fortran 77, pour que toutes les variables commençant par les lettres I à N soientdes entiers et non des float.
    Dans mon code j'ai prévu 4 intructions if différentes et bloquées en commentaire et nommées CAs 0, ....CAS 3.
    Le but final étant le cas 3 qui utilise comme indices dans ICHEC le contenu des cases d'un autre tableau IT.

    Les résultats:Bref quand je valide successivement les CAS 1, CAS2, CAS3 j'obtiens toujours "unclassifiable statement"
    Sei le CAS 0, heureusement, s'execte le IF étant validé, le résultat de l'exécution montre que les conditions pour les 3 cas litigieux sont pourtant vérifiées.Dans le cas 2, j'ai mis une variable plutot qu'une constante!!
    Apparemment je n'ai pas d'erreur de syntaxe dans les "IF", dans le résultat du CAS 0, les nombres me semblent prendre beaucoup de place, est_ce une histoire de "INTEGER"? une histoire de je séche lamentablement§ Je joins le code et l'image de l'exécution du CAS 0

    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
     
    program test
        IMPLICIT integer(i-n)
        dimension ichec(8,8)
        dimension it(8,8)
        ichec=0;it=0
        !It est un tableau de travail qui donne les indices dans le tableau ichec
        lig=1
        it(3,1)=5
        it(3,2)=6
        limit=7
     
       m=it(3,1)    !pour tester avec des variables simples et non des postes de tableaux
       n=it(3,2)    !pour tester avec des variables simples et non des postes de tableaux
     
        ichec(it(3,lig),it(3,lig+1))=7   !on force 7 dans la case echiquier(5,6) pour tester )
        if(6>5) goto 100                                   !CAS 0
        !if ichec(m,n)=7 goto 100                      !CAS 1 indices du tableau avec variables numériques
        !if ichec(m,n)=limit  goto 100                 !CAS 2indices du tableau avec variables numériques
        !if ichec((it(3,lig)),(it(3,lig+1))=7            !CAS 3 Indices du tableau Ichec pris dans tableau IT
     
     100 print *, "ichec(m,n)", ichec(m,n), "it(3,lig) =", it(3,lig), "it(3,lig+1) =",it(3,lig+1)
        end PROGRAM
    Nom : execution_test.JPG
Affichages : 134
Taille : 45,4 Ko
    Images attachées Images attachées  

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 103
    Points : 1 035
    Points
    1 035
    Billets dans le blog
    1
    Par défaut syntaxe des IF
    Bonjour @girondin

    je vois deux problèmes dans les IF en commentaires :
    1. l'expression logique doit être mise entre parenthèses,
    2. le test d'égalité en Fortran s'écrit == ou .eq.


    On devrait donc par exemple avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (ichec(m,n) == limit)  goto 100
    Autres remarques :
    1. En Fortran moderne, il est déconseillé d'utiliser IMPLICIT integer(i-n). Il est conseillé d'utiliser systématiquement IMPLICIT NONE et de déclarer le type des variables. Un typage fort évite des erreurs.
    2. Les goto pourraient être évités. Ils ne facilitent pas la compréhension de la structure du programme.

  3. #3
    Membre à l'essai
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 93
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2014
    Messages : 12
    Points : 15
    Points
    15
    Par défaut
    Bonjour V.agnin et merci,
    Il est vrai que je suis nonagénaire, et mes souvenir sont de fortran 66 , je me posais la question du IF logique mais comme (9>5) fonctionne sans utiliser .GT. je n'ai pas poussé plus loin! Je me demandais aussi s(il fallait quelque chose du style INTEGER*1, je suis confus d'alerter le forum pour des erreurs de syntaxe mais enchanté d'avoir des réponses si précises. Dans mon IF j'ai compté les parenthèses ouvertes et fermé. Le message "nclassifiable statement" ne me parlait pas beaucoup. Je vois ici comment utilises la balise LIST Merci

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 103
    Points : 1 035
    Points
    1 035
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    Il est vrai que je suis nonagénaire, et mes souvenirs sont de fortran 66
    Ca fait plaisir à voir !

    Les messages des compilateurs ne sont effectivement pas toujours très explicites !

    Pour la déclaration d'une variable entière i, vous pouvez écrire en Fortran moderne (c'est-à-dire Fortran>=90) :
    Sur les PC actuels, ça correspondra à une variable sur 4 octets, donc pouvant coder des entiers entre environ -2 milliards et +2 milliards. On pourrait aussi écrire :
    ou
    Toutes ces syntaxes sont l'équivalent d'un "integer*4" en "ancien" Fortran. Sur certains compilateurs, le 4 peut ne pas correspondre au nombre d'octets, mais restons simples.

  5. #5
    Membre à l'essai
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 93
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2014
    Messages : 12
    Points : 15
    Points
    15
    Par défaut
    Merci pour les explications
    J'ai programmé sur le 1130 d'IBM dans les années 60, macine à mots de 16 bits et non octets , les integer par défaut était donc de 2 puissance 15 donc 32768 , si j'ai compris cela doit être du "integer*2".Sinon il fallait passer en "double précision".

    Quel est l'oérater "::" que je ne trouve pas?, pour le moment j'ai des problàmes "Codeblocks" , je vais poster sur le forum

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 103
    Points : 1 035
    Points
    1 035
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par girondin Voir le message
    Merci pour les explications
    J'ai programmé sur le 1130 d'IBM dans les années 60, macine à mots de 16 bits et non octets , les integer par défaut était donc de 2 puissance 15 donc 32768 , si j'ai compris cela doit être du "integer*2".Sinon il fallait passer en "double précision".

    Quel est l'oérater "::" que je ne trouve pas?, pour le moment j'ai des problàmes "Codeblocks" , je vais poster sur le forum
    Oui, "integer*2", ce serait écrit maintenant "integer(2)" ou "integer(kind=2)".

    Le :: est juste un séparateur entre les types de données et les noms des variables. Par exemple, ici je déclare i comme une variable entière (32 bits par défaut sur les machines actuelles), et je déclare j et k comme deux constantes entières :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    integer            :: i
    integer, parameter :: j, k
    Pour faire "beau" j'ai aligné les :: des deux lignes, mais ce n'est pas du tout obligatoire.

Discussions similaires

  1. probleme fortran 90 exception:access violation
    Par rijks dans le forum Fortran
    Réponses: 2
    Dernier message: 25/10/2010, 15h14
  2. Probleme d'exécution en fortran
    Par rihab1509 dans le forum Fortran
    Réponses: 5
    Dernier message: 23/06/2009, 14h41
  3. probleme de compteur fortran
    Par altopic dans le forum Fortran
    Réponses: 1
    Dernier message: 19/06/2009, 11h51
  4. Probleme Puissance inverse Fortran
    Par G4uthier dans le forum Fortran
    Réponses: 0
    Dernier message: 17/06/2009, 18h10
  5. Fortran vers VBA : problème d'arrondi
    Par sun19 dans le forum Fortran
    Réponses: 4
    Dernier message: 23/11/2006, 17h01

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