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 :

Common + Character


Sujet :

Fortran

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut Common + Character
    Bonjour,

    J'ai recherche rapidement dans les cours propose et sur la toile mais je pense que je m'y prend mal.

    Ma question est simple :

    J'ai tout cela comme variable dans ma subroutine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          parameter (ncode=5,nidtmax=600,mxindx=10000)
          integer idtbl(ncode,nidtmax),ifl1tbl(nidtmax),nlinex(ncode)
          integer ifl2tbl(nidtmax),ifl3tbl(nidtmax),jspintbl(nidtmax)
          integer chrgtbl(nidtmax),nlidtbl(mxindx),nidtmxx(ncode)
          real amtbl(nidtmax)
          character line*110
          character (len=50) :: nametbl(nidtmax)
    Et je veux en mettre beaucoup dans un common, aucun souci je fais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          common/cidt/idtbl(ncode,nidtmax),ifl1tbl(nidtmax),
         *ifl2tbl(nidtmax),ifl3tbl(nidtmax),jspintbl(nidtmax),
         *chrgtbl(nidtmax),amtbl(nidtmax),nlidtbl(mxindx),
         *nametbl(nidtmax),nidtmxx(ncode),nlinex(ncode),nidtbl
    Mais le probleme est que je ne sais pas comment dire que mon tableau nametbl est un tableau contenant des character, egalement est-ce qu'il sait que amtbl est un real et non un entier ?

    Merci d'avance,

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Apres si vous voulez plus d'information, j'ai cette subroutine qui fonctionne comme je le souhaite et je voudrais juste utiliser les variables dans plusieurs autres subrtouines, le common me semblait tout a fait approprie pour cette methode,

    voici la subroutine entiere (pas tres grande) :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    c-----------------------------------------------------------------------
          subroutine readidtables 
    c     read the table in KWt/ids.dt who contain all ids 
    c     informations for particles in EPOS
    c-----------------------------------------------------------------------
          include "aaa.h"
          parameter (ncode=5,nidtmax=600,mxindx=10000)
    c      integer idtbl(ncode,nidtmax),ifl1tbl(nidtmax),nlinex(ncode)
    c      integer ifl2tbl(nidtmax),ifl3tbl(nidtmax),jspintbl(nidtmax)
    c      integer chrgtbl(nidtmax),nlidtbl(mxindx),nidtmxx(ncode)
    c      real amtbl(nidtmax)
          character line*110
    c      character (len=50) :: nametbl(nidtmax)
     
          common/cidt/idtbl(ncode,nidtmax),ifl1tbl(nidtmax),
         *ifl2tbl(nidtmax),ifl3tbl(nidtmax),jspintbl(nidtmax),
         *chrgtbl(nidtmax),amtbl(nidtmax),nlidtbl(mxindx),
         *(len=50) :: nametbl(nidtmax),nidtmxx(ncode),nlinex(ncode),nidtbl
     
          data kids/0/
          kids=kids+1 
     
          if(kids.eq.1)then
            write(ifmt,'(a)')            'load ids from '
            write(ifmt,'(1x,a)')fnnx(1:nfnnx)//'KWt/ids.dt'
            open (95,file= fnnx(1:nfnnx)//'KWt/ids.dt'
         *  ,STATUS='UNKNOWN')
            nline=0
     
            do
    998       read(95,'(a)', end=999)line
              if(line(1:1).eq.'!')goto 998
              jj=0 !count number of words in line
              do jjx=1,105 !up to number of character in one line
                if(line(jjx:jjx).eq.' '.and.line(jjx+1:jjx+1).ne.' ')jj=jj+1
              enddo
    c          print*,jj,line
              if(jj.eq.0)goto 998 
     
              nline=nline+1
              if(nline.gt.nidtmax)stop'ERROR nidtmax too small'
              read(line,* )idtbl(1,nline), idtbl(2,nline),idtbl(3,nline)
         .    ,idtbl(4,nline),idtbl(5,nline),nametbl(nline),ifl1tbl(nline)
         .    ,ifl2tbl(nline),ifl3tbl(nline),jspintbl(nline)
         .    ,amtbl(nline),chrgtbl(nline)
     
              idepos=idtbl(1,nline)
              if(idepos.le.6666.and.idepos.ge.1)then
                nlidtbl(idepos)=nline
    c            print*, nlidtbl(idepos),nline,idepos
              endif
     
              do i=1,ncode
                 if(idtbl(i,nline).ne.99)then
                   nlinex(i)=nlinex(i)+1
                   nidtmxx(i)=nlinex(i)
                 endif
              enddo 
     
            enddo
     
     
    999     continue
            nidtbl=nline
    c        write(*,*)nidtbl !to check
            close(95)
          else 
            write(ifmt,'(a)')'ids.dt: already loaded'
          endif
     
          end
    le ifmt me defini le fait que j'ecris au terminal en interactif et dans un fichier en batch, et le fnnx etc .. me defini un chemin special ou je lis mon fichier car on change regulierement de version dans notre programme et on a creer cette methode pour que tout le monde puisse s'en sortir.

    Egalement, pour terminer le fichier que je lis est un fichier du type :
    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
    40
    41
    42
     
    !------------------------------------------
    !      List of particle codes
    !-----------------------------------------
    ! column 1 : EPOS
    ! column 2 : PDG
    ! column 3 : QGSJET
    ! column 4 : GHEISHA
    ! column 5 : SIBYLL
    ! column 6 : Name of the particle
    ! column 7 : ifl(1)
    ! colunm 8 : ifl(2)
    ! column 9 : ifl(3)
    ! columnn 10 : jspin
    ! column 11 : Mass
    ! column 12 : chrg
    ! colunm 13 : label
    !-----------------------------------------
     1    2    99   99   99   u        1  0  0  0  0.002        2/3
     2    1    99   99   99   d        2  0  0  0  0.005        -1/3
     3    3    99   99   99   s        3  0  0  0  0.100        -1/3
     4    4    99   99   99   c        4  0  0  0  1.200        2/3
     5    5    99   99   99   b        5  0  0  0  4.600        -1/3
     6    6    99   99   99   t        6  0  0  0  171.0        2/3
     10   22   99   1    1    gamma    0  0  0  0  0            0
     9    21   99   99   99   gluons   0  0  0  0  0            0
     12   11   11   3    3    e-       0  0  0  0  0.511003e-3  -1
     -12  -11  -11  2    2    e+       0  0  0  0  0.511003e-3  1
     11   12   99   66   15   nu_e-    0  0  0  0  0            0
     -11  -12  99   67   16   nu_e+    0  0  0  0  0            0
     14   13   99   6    5    mu-      0  0  0  0  0.105661     0
     -14  -13  99   5    4    mu+      0  0  0  0  0.105661     0
     13   14   99   68   17   nu_mu-   0  0  0  0  0            0
     -13  -14  99   69   18   nu_mu+   0  0  0  0  0            0
     16   15   99   132  19   tau-     0  0  0  0  1.777        0
     -16  -15  99   131  -19  tau+     0  0  0  0  1.777        0
     15   16   99   133  20   nu_tau-  0  0  0  0  0            0
     -15  -16  99   134  -20  nu_tau+  0  0  0  0  0            0
    ! -------------------------------------------
    !       List of mesons
    ! -------------------------------------------
     110   111      0    7    6   pi0              1  1  0  0  0.13499     0
    etc ....

    Normalement je devrais avoir donne assez d'information mais si vous avez besoin de quoi que ce soit d'autre, je repondrais avec plaisir

  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
    Je n'ai pas vraiment lu tout ce que tu as écrit, alors peut-être que je manque quelque chose...

    La technique consiste à séparer la déclaration et l'assignation au common :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
          parameter (ncode=5,nidtmax=600,mxindx=10000) ! devrait être écrit integer, parameter :: ncode=5, nidtmax=600, mxindx=10000 en F90+
          integer idtbl(ncode,nidtmax),ifl1tbl(nidtmax),nlinex(ncode)
          integer ifl2tbl(nidtmax),ifl3tbl(nidtmax),jspintbl(nidtmax)
          integer chrgtbl(nidtmax),nlidtbl(mxindx),nidtmxx(ncode)
          real amtbl(nidtmax)
          character (len=50) :: nametbl(nidtmax)
     
          common/cidt/idtbl,ifl1tbl,
         *ifl2tbl,ifl3tbl,jspintbl,
         *chrgtbl,amtbl,nlidtbl,
         *nametbl,nidtmxx,nlinex,nidtbl
    Ensuite, pour t'assurer que le common a la même déclaration partout, tu le mets dans un fichier (ex: comm_cidt.h) et tu l'include partout où tu en as besoin.

    Dernier commentaire : les commons, ça fait très Fortran 77. Tu devrais utiliser un module.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Merci pour la reponse !

    Je vais regarder ce qu'est un module mais mon directeur de these aime particulierement les programmes en vieux fortran et il aimerait que notre code fonctionne pour un grand nombre de version de fortran donc c'est un peu particulier comment on ecrit dans le programme, je vais regarder si la separation fonctionne,

    Donc la compilation fonctionne et pour la lecture du fichier il ne semble pas y avoir de probleme mais le probleme est maintenant lorsque je veux utiliser ces variables dans une autre subroutine,

    J'ai actuellement mis le common :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          common/cidt/idtbl,ifl1tbl,
         *ifl2tbl,ifl3tbl,jspintbl,
         *chrgtbl,amtbl,nlidtbl,
         *nametbl,nidtmxx,nlinex,nidtbl
    Dans une autre subroutine, mais lorsque je veux compiler, on me dit qu'il y a un conflit avec (par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          do n=1,nidtmax
            print*, nametbl(n)
          enddo
    Le conflit vient du fait qu'il ne pense plus que c'est un tableau ?
    Pour que cela fonctionne, je suis donc oblige de refaire les declarations avant ? Comme par exemple pour cette variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                character (len=50) :: nametbl(nidtmax)
    Ou alors je suis oblige de partir d'un comm_cidt.h (ce serait un peu contraignant avec la facon d'ou on utilise notre code mais cela reste faisable)

  5. #5
    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 que ça fonctionne bien, tu dois avoir un comm_cidt.h contenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          parameter (ncode=5,nidtmax=600,mxindx=10000)
          integer idtbl(ncode,nidtmax),ifl1tbl(nidtmax),nlinex(ncode)
          integer ifl2tbl(nidtmax),ifl3tbl(nidtmax),jspintbl(nidtmax)
          integer chrgtbl(nidtmax),nlidtbl(mxindx),nidtmxx(ncode)
          real amtbl(nidtmax)
          character (len=50) :: nametbl(nidtmax)  ! En passant, cette ligne est en syntaxe F90+
     
          common/cidt/idtbl,ifl1tbl,
         *ifl2tbl,ifl3tbl,jspintbl,
         *chrgtbl,amtbl,nlidtbl,
         *nametbl,nidtmxx,nlinex,nidtbl
    De là, tu include tout ça quand tu en as besoin. Tu dois donc enlever toutes les lignes correspondantes du code initiale et les remplacer par include 'comm_cidt.h', dans chaque routine/programme.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Points : 44
    Points
    44
    Par défaut
    Ok parfait, merci beaucoup pour cette reponse !

    Probleme resolu !

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

Discussions similaires

  1. Problème avec accents et CHARACTER SET ISO8859_1
    Par kinda dans le forum InterBase
    Réponses: 13
    Dernier message: 30/10/2003, 15h49
  2. IB 6.0.1 - Win XP - Character Set
    Par SuperTotor dans le forum InterBase
    Réponses: 4
    Dernier message: 03/06/2003, 20h25
  3. [XMLRAD] invalid character type
    Par Sylvain James dans le forum XMLRAD
    Réponses: 4
    Dernier message: 10/12/2002, 07h47
  4. Quoi ?! Common Dialog fait crasher DirectDraw ?
    Par Magus (Dave) dans le forum DirectX
    Réponses: 4
    Dernier message: 21/10/2002, 19h01
  5. character set // Nls_lang
    Par fopicht dans le forum Oracle
    Réponses: 2
    Dernier message: 23/05/2002, 12h04

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