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 :

Compiler un script


Sujet :

Fortran

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut Compiler un script
    Bonjour à tous,

    Je suis sous MAC OS X 10.4.11 (Tiger) et je souhaite compiler des codes en fortran venus d'une vielle machine SUN. Je ne suis pas un as de la compilation alors je fais appel à vous.

    Que dois-je changer dans le makefile?
    Voici le makefile avec un fichier au pif pour que vous puissiez essayer.

    Pour l'instant j'ai oté les options -fast -xtarget=ultra2 -xcache=16/32/1:4096/64/1 -Bstatic -dn de FFLAGS et ca a l'air de marcher (j'ai des warnings et des erreurs alors qu'avant j'avais un "f77: language cache=16/32/1:4096/64/1 not recognized")

    La première erreur est la suivante:
    reads.f:124:
    READ (LU, 1000, END=999, ERR=998) NC, RECORD
    1000 FORMAT (Q, A)
    ^
    Unsupported FORMAT specifier at (^)

    Merci d'avance
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip src.zip (426,3 Ko, 67 affichages)

  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
    Points : 1 346
    Points
    1 346
    Par défaut
    Le problème ne semble pas lié au makefile, mais au fait que le Q dans le format est une extension non supportée par ton compilateur.

    Tu dois donc modifier le programme pour ne plus utiliser cette extension, ou utiliser un compilateur supportant cette extension.

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Merci pour ta réponse.

    Connais-tu un compilateur sous MAC OS X (Tiger) qui soit capable de prendre en compte cette extention? Personnellement, je n'ai jamais vu cette extension "Q". Tu sais à quoi elle peut correspondre?

  4. #4
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    READ (LU, 1000, END=999, ERR=998) NC, RECORD
    1000 FORMAT (Q, A)
    Dans mon manuel Compaq Fortran, le descripteur Q est expliqué mais indiqué comme non standard:
    The character count edit descriptor returns the remaining number of characters in the current input record
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Merci

    Et sais tu à quoi il correspond, et surtout comment le remplacer dans le format standard??

  6. #6
    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
    Returning the Number of Bytes: The Q Descriptor

    The Q edit descriptor returns the number of bytes remaining on the
    current input record. The value is returned to the next item on the
    input list, which must be an integer variable. This descriptor applies
    to input only and is ignored by the WRITE or PRINT statements.

    For example, in the program:

    PROGRAM q_format_input

    CHARACTER string(80)

    READ(5,100) len, (string(i), i = 1, min(len, 80))
    100 FORMAT(Q, 80A1)

    END

    the variable len gets assigned the current length of the string. The Q
    edit descriptor is used to avoid an error from reading more bytes from
    the input record than are available, or from having blanks provided that
    were not in the input file.


    donc je ne sais pas trop comment le "transformer" en standard...
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  7. #7
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Ton problème n'est pas tout simple. Je te suggère de procéder comme ceci:
    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
    C     Tu déclares une variable de type "chaîne" suffisamment
    C     longue, c'est-à-dire plus longue que le plus long de tes
    C     enregistrements.
          Character*1000 Record
    C
    C     Tu lis chaque enregistrement et tu stockes son contenu
    C     dans la variable Record.
          Read (4,'(A)') Record
    C     A partir de ce moment, la variable Record contient le
    C     contenu de ton enregistrement suivi d'autant d'espaces
    C     que nécessaire pour le remplir complètement.
    C
    C     Si tu as besoin du nombre de caractères sans  les espaces
    C     qui ont été rajoutés, tu utilises la fonction Len_Trim:
          Write (*,'(I4)') Len_Trim(Record)
    C     ou
          Write (*,(A)') 'Avant'//Record(1:Len_Trim(Record))//'Après'
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  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
    En complément à la réponse de Jean-Marc :

    La solution de Jean-Marc fonctionne si les espaces à la fin de la ligne ne sont pas significatifs. Comme le programme fait déjà la lecture d'une variable caractère (variable RECORD), tu pourrais analyser si la solution suivante fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    READ (LU, 1000, END=999, ERR=998) RECORD
    1000 FORMAT (A)
    NC = len_trim(Record)
    Si ces espaces sont significatifs, tu dois alors utiliser une solution reposant sur une boucle contenant un read avec le paramètre advance="no".

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    ok, ma compilation marche!!! merci à tous.... J'ai galéré un bon moment, mais j'ai fini par réussir. Pour info j'ai du trouver que le compilateur g77 doit être lié à gcc3.3 et non gcc4.0 pour que ca puisse compiler correctement.

    je dois encore me pencher sous le cas de l'erreur du descripteur Q que j'ai temporairement résolu en faisant :

    READ (LU, 1000, END=999, ERR=998) RECORD
    1000 FORMAT (A)
    NC = len_trim(RECORD)

    Mais je ne sais pas encore si cela fait exactement la même chose.

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Je viens de trouver cela sur ce site:
    http://publib.boulder.ibm.com/infoce...r/dataedit.htm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    @PROCESS QCOUNT
           CHARACTER(50) BUF
           INTEGER(4) NBYTES
           CHARACTER(60) STRING
           ...
           BUF = 'This string is 29 bytes long.'
           READ( BUF, FMT='(Q)' ) NBYTES
           WRITE( *,* ) NBYTES
    ! NBYTES equals 50 because the buffer BUF is 50 bytes long.
           READ(*,20) NBYTES, STRING
    20     FORMAT(Q,A)
    ! NBYTES will equal the number of characters entered by the user.
           END
    Je pense que d'après cette exemple, la fonction len_trim peut remplacer le descripteur Q. Mais je souhaiterai avoir votre avis pour en être tout à fait sûr...

    Merci d'avance


    Edit -------


    En fait le code dans mon programme est le suivant, le but étant de trouver NC (ouput de la fonction)

    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
     
          SUBROUTINE READL (LU, TEXT, NCH, CHAR, IEOF, IERR)
    C-----------------------------------------------------------------
    C
    C THIS WAS ALSO TAKEN FROM NODIS - WJT
    C
    C  THIS SR READS AN 80 CHARACTER RECORD, SEARCHES FOR A SPECIFIED
    C CHARACTER, AND THEN PLACES THE CHARACTERS FOLLOWING THE DESIRED
    C CHARACTER INTO THE ARRAY TEXT.  IN ADDITION, TEXT(NCH+1) IS SET
    C TO 0 (THIS FACILITATES OPENING OF FILES).
    C
    C INPUTS......
    C
    C   TEXT      A LOGICAL*1 ARRAY INTO WHICH THE CHARACTERS FOLLOWING
    C               THE SEARCH CHARACTER ARE STORED
    C   CHAR      (L1) THE SEARCH CHARACTER
    C   LU        THE LOGICAL UNIT TO READ
    C
    C OUTPUTS......
    C
    C   TEXT      (AS ABOVE)
    C   NCH       THE NUMBER OF CHARACTERS RETURNED IN TEXT (AS IN Q FMT)
    C   IEOF      =0 IF NO EOF ENCOUNTERED
    C             =1 IF AN EOF IS ENCOUNTERED ON UNIT LU
    C   IERR      =0 IF NO ERRORS
    C             =1 IF ERRORS ENCOUNTERED
    C
    C NON-LIBRARY ROUTINES CALLED:  NONE
    C----------------------------------------------
    C
          CHARACTER  RECORD*80, TEXT*(*)
          CHARACTER*1 NULL,CHAR
     
    ...
          READ (LU, 1000, END=999, ERR=998) NC, RECORD
     1000 FORMAT (Q,A)
          DO 100 I = 1, NC
             IF (RECORD(I:I) .EQ. CHAR) GO TO 101
      100    CONTINUE
    C ERROR - SEARCH CHARACTER NOT FOUND
          GO TO 998
    C
      101 NCH = NC - I
    Ne suffirait-il pas tout simplement de poser NC=80?? Ca serait un peu moins optimisé, mais au moins ca marcherai sans le moindre doute.

    Qu'en pensez-vous???

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Je me permets un petit up...

  12. #12
    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
    On ne peut pas savoir si tu peux mettre NC = 80, car on ne sait pas comment TEXT et NCH sont utilisés.

    Si toutes tes lectures du fichier sont effectuées dans la routine illustrée, je convertirais probablement le code pour faire usage de read advance no, mais c'est un choix personnel.

    Si tu peux facilement refaire des runs et comparer les résultats avec le programme non modifié, tu peux effectivement essayer avec NC = len_trim(Record), ou = len(Record), ou = 80.

  13. #13
    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
    Complément pour expliquer la différence entre len_trim, len, et le read advance no.

    Supposons que tu veuilles lire un fichier dont la ligne contient bozo suivi de 3 espaces, puis du marqueur de fin de ligne et la variable correspondant (Record) est déclarée character (80).

    Après la lecture, Record contient bozo et les 3 espaces, puis est complété par 73 espaces pour faire 80.

    La fonction len_trim(Record) retourne 4, len(Record) retourne 80, et le format Q retournait 7. Quelle réponse ton programme a t-il besoin pour bien fonctionner ?

    Le read advance no permet de lire la ligne caractère par caractère, puis de retrourner un code d'erreur end-of-record, ce qui permet effectivement de savoir que la ligne contient 7 caractères.

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Si j'en juge par les lignes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DO 100 I = 1, NC
             IF (RECORD(I:I) .EQ. CHAR) GO TO 101
      100    CONTINUE
    C ERROR - SEARCH CHARACTER NOT FOUND
          GO TO 998
    C
      101 NCH = NC - I
    La boucle compare les caractère les uns après les autres de RECORD et les compare à CHAR, un des buts de la fonction étant de retourner la variable NCH. Donc si je pose NC=80, cela ne devrait rien changer, puisque la boucle s'arrêtera quand RECORD(I:I) .EQ. CHAR.

    Mon raisonnement est-il correct? Merci d'avance...

  15. #15
    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
    La partie affichée de la fonction montre que NCH est égal au nombre de caractère suivant CHAR. Les commentaires au début de la fonction indique que TEXT contient en sortie ces caractères suivant CHAR. Jusque là, rien ne dit si les blancs de la fin sont pertinents. En relisant la section affichée de la fonction, je remarque ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    C ................................IN ADDITION, TEXT(NCH+1) IS SET
    C TO 0 (THIS FACILITATES OPENING OF FILES).
    Si le caractère 0 est ajouté à la fin, alors selon moi ton programme passe éventuellement TEXT à une fonction C qui fait un file open (?). Dans ce cas, j'aurais tendance à privilégier la solution len_trim() et non 80 car les espaces résiduels sont pertinents en C...

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    oui, je crois que tu as raison.... Je pars pour la solution len_trim. On verra à l'usage si ca plante (je n'ai pas encore d'exemple pour tester le prog)
    ok merci à tous!!!

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

Discussions similaires

  1. Compilation de scripts
    Par musely dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 26/11/2007, 15h06
  2. Compilation de Script
    Par Ash2oπΩ dans le forum Langage
    Réponses: 7
    Dernier message: 18/04/2007, 14h37
  3. [Compiler] Problème pour compiler un script
    Par usama2 dans le forum MATLAB
    Réponses: 3
    Dernier message: 18/02/2007, 14h52
  4. Compiler un script cpp complexe déjà existant
    Par ThFreno dans le forum C++
    Réponses: 5
    Dernier message: 19/01/2007, 16h39
  5. compiler un script perl
    Par black_code dans le forum Langage
    Réponses: 9
    Dernier message: 03/09/2005, 16h30

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