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, pb incrémentation


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Par défaut Fortran 77, pb incrémentation
    Bonjour,

    Voici un bout de code en Fortran 77, que j'essaie de compiler
    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
    	  open(3,file='VP/rayden'//depth//'.xyz') ! open outputfile
    	  dx=sei_xp(1)-sei_xp(2)
    	  dy=sei_yp(1)-sei_yp(2)
    	  do iy=1,sei_ny
    	   do ix=1,sei_nx
    c now determine 4 clases for ray distribution
    	   qual=0
    	   if ((ev(k,2)/ev(k,3)).gt.rtio1.and.(ev(k,1)/ev(k,3)).gt.rtio1) then
                qual=1
    	    goto 90
    	   endif
    	   if ((ev(k,2)/ev(k,3)).gt.rtio1.and.(ev(k,1)/ev(k,3)).lt.rtio1) then
    	    qual=2
    	    goto 90
    	   endif
    	   if ((ev(k,2)/ev(k,3)).gt.rtio2.and.(ev(k,1)/ev(k,3)).lt.rtio1) then
    	    qual=3
    	    goto 90
    	   endif
    	   if ((ev(k,2)/ev(k,3)).lt.rtio2.and.(ev(k,1)/ev(k,3)).lt.rtio2) then
    	    qual=4
    	   endif
    90         continue
    c calculate projection of vector onto xy-plane
    	   if (qual.eq.2) then
    	    do l=2,3     ! two main directions, print both on output
    	     projx=sei_xp(ix)+(vec(l,k,1)*dx/2) 
    	     projy=sei_yp(iy)+(vec(l,k,2)*dy/2)
    	     call km2deg(sei_xp(ix),sei_yp(iy),lat,lon)
    	     call km2deg(projx,projy,projlat,projlon)
    	     write(3,1050)qual,k,blwray(k),lon,lat,projlon,projlat,
         &       sei_xp(ix),sei_yp(iy),projx,projy
    	    enddo
    	   else
    	    projx=sei_xp(ix)+(vec(3,k,1)*dx/2)
    	    projy=sei_yp(iy)+(vec(3,k,2)*dy/2)
    	    call km2deg(sei_xp(ix),sei_yp(iy),lat,lon)
    	    call km2deg(projx,projy,projlat,projlon)
    	    write(3,1050)qual,k,blwray(k),lon,lat,projlon,projlat,
         &      sei_xp(ix),sei_yp(iy),projx,projy
    	   endif  !qual.eq.2
    	   do m=1,invlay  ! if first block of layer skip nex
    	      if (k.eq.inv_bloc(m).and.iy.eq.1) ix=ix+1
    	   enddo
    	   k=k+1  ! next block
    1050       format(i2,1x,i4,1x,f8.2,1x,2(f8.4,1x),2(f8.4,1x),4(f7.2,1x))
               enddo !ix
    	  enddo !iy
    	  close(3)
    Mon soucis est l'incrémentation de la variable ix. Ca ne passe pas avec mon compilateur. Je ne sais pas trop par quoi le remplacer. Pour l'instant j'utilise cycle ix_loop (en nommant la boucle sur ix, ix_loop), mais je ne sais pas si cela produit le même résultat...

    Merci pour votre aide

  2. #2
    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
    Par défaut
    Réponse à la question principale : dans une boucle, tu n'as pas le droit de modifier manuellement le compteur de la boucle. Donc, l'exemple suivant est illégal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    do ix=1,sei_nx
       if (k.eq.inv_bloc(m).and.iy.eq.1) ix=ix+1
    enddo !ix
    Tu devras remplacer la boucle comptée par une boucle conditionnelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ix=1
    do while( ix <= sei_nx)
       ...
       if (k.eq.inv_bloc(m).and.iy.eq.1) ix=ix+1
       ...
       ix = ix + 1
    enddo !ix
    Un petit commentaire sur les if goto endif de début de boucle : ce serait plus joli avec des elseif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if ((ev(k,2)/ev(k,3)).gt.rtio1.and.(ev(k,1)/ev(k,3)).gt.rtio1) then
       qual=1
    elseif ((ev(k,2)/ev(k,3)).gt.rtio1.and.(ev(k,1)/ev(k,3)).lt.rtio1) then
       qual=2
    elseif ((ev(k,2)/ev(k,3)).gt.rtio2.and.(ev(k,1)/ev(k,3)).lt.rtio1) then
       qual=3
    elseif ((ev(k,2)/ev(k,3)).lt.rtio2.and.(ev(k,1)/ev(k,3)).lt.rtio2) then
       qual=4
    else
       qual=0
    endif
    Sans goto, tu donneras moins d'argument à certains...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Par défaut
    Merci pour ces réponses très complètes...

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

Discussions similaires

  1. [Fortran 77] Problème incrémentation nom_fichier
    Par mecanique dans le forum Fortran
    Réponses: 21
    Dernier message: 23/05/2008, 01h05
  2. [TP]Portage d'un encodeur MP3 Fortran en pur Pascal...
    Par Christophe Fantoni dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 04/07/2003, 17h34
  3. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19
  4. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10
  5. Post incrémentation?
    Par Defrag dans le forum C
    Réponses: 4
    Dernier message: 08/10/2002, 10h36

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