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 :

[Débutant] Questions diverses


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 15
    Points
    15
    Par défaut [Débutant] Questions diverses
    Bonjour à tous,

    Je suis quasiment débutante en fortran et je dois, dans le cadre de mon travail, un code dans ce langage. J'ai cherché dans les différents tutoriaux conseillés sur le site et aussi sur d'autres mais il reste quelques petits points que j'aurais besoin d'éclaircir :

    - Est-il possible de gérer des chaînes de caractère de longueur variable en fortran ? (Je dois lire des strings dans des fichiers mais je n'ai aucune idée de leur longueur)
    - Existe-t-il une fonction qui permet de "pointer" sur la ieme lettre d'une chaîne de caractère ?
    - Comment définir des variables globales ? Dans un module ou dans un common block ?
    - Est-il mieux de définir les subroutines dans des modules ou peut-on simplement les écrire les unes après les autres dans un fichier .f90 lié au fichier contenant le programme principal ?

    J'espère que vous pourrez m'aider !

    D'avance merci,

    Mathlus.

  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
    Est-il possible de gérer des chaînes de caractère de longueur variable en fortran ? (Je dois lire des strings dans des fichiers mais je n'ai aucune idée de leur longueur)

    Pas vraiment. Les variables caractères Fortran sont de longueur fixe et elles sont « paddées » avec des blancs au besoin.

    Si les espaces à la fin ne sont pas significatif pour toi, la technique consiste simplement à déclarer une variable suffisamment longue et à lire les chaînes dans le fichier. Tu peux alors obtenir la longueur logique par la fonction len_trim() (en F90 et plus, et souvent disponible en F77).

    Si les espaces à la fin sont significatifs, les choses se compliquent. Tu dois généralement associer une variable « longueur logique » à la variable caractère. Pour la lecture, il faut souvent lire caractère par caractère avec un read( , advance="NO").

    Finalement, il existe un module VarString (nom incertain) qui n'a pas une très bonne réputation (produit des pertes de mémoire), mais les plus récentes versions utilisant TR?????? seraient plus robustes.

    Existe-t-il une fonction qui permet de "pointer" sur la ieme lettre d'une chaîne de caractère ?

    VarCar(i:j) retourne la sous-chaîne contenant les caractères i à j.

    Comment définir des variables globales ? Dans un module ou dans un common block ?

    À mon avis (et je ne suis pas le seul à le penser!), la seule raison de maintenir des common block dans un programme est si l'effort pour les enlever est indu.

    Est-il mieux de définir les subroutines dans des modules ou peut-on simplement les écrire les unes après les autres dans un fichier .f90 lié au fichier contenant le programme principal ?

    Le concept de fichier source n'existe pas en Fortran; il n'y a pas de « file scope ». Quelques compilateurs valident les appels de fonctions externes si elles sont dans le même fichier, mais ce n'est pas généralisé.

    De plus, pour utiliser des passages d'argument introduit par F90 (intent, optional, dimension(:,), ...), tu dois fournir un interface au sous-programme. Avec un module, l'interface est autogénéré par le compilateur: plus simple et moins d'erreur.

    Je te recommande donc fortement d'utiliser des modules. La seule limite au module, c'est si tu veux faire des vieux trucs pré gestion dynamique de mémoire comme il y a 30 ans...

    Pour ce qui est du « simplement », tu peux utiliser un module aussi simple que :

    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
    module FoureTout
       implicit none
       public
    contains
     
    subroutine Sub1(...)
    end subroutine
     
    function Fct1(...)
    end function
     
    subroutine Sub2(...)
    end subroutine
     
    subroutine Sub3(...)
    end subroutine
     
    end module

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup pour cette réponse si détaillée !

    Pour tout dire, j'avais déjà commencé à tout coder dans des modules, ce qui me semblait la solution la plus adaptée mais je voulais être sûre...

    Concernant les chaînes de caractère, ça m'embête un peu plus parce que les mes clients sont habituées au char* du C et ne comprennent pas bien pourquoi j'utilise des chaînes de longueur fixe... En fait, j'espérais pouvoir créer un tableau de character que j'allouerai en fonction de la longueur de la chaîne lue caractères par caractères mais si c'est pas possible, tant pis !!! Je leur expliquerai !!

    Encore merci,

    Mathlus.

  4. #4
    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
    Tu dois préciser le besoin car l'équivalent de [C] char *s, c'est [F] character (len=1) :: s(: ). Le hic, c'est que Fortran beaucoup va mieux avec des caractaères scalaires de longueur prédéfinie (ce qui n'existe pas en C) qu'avec des vecteurs dont les éléments ont 1 byte (comme en C).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Oki ! Je comprends !

    Tant pis, je garde mes longueurs constantes !

    @ +,

    Mathlus.

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

Discussions similaires

  1. [Débutant] Question diverses d'un débutant.
    Par Nikimizi dans le forum Visual Studio
    Réponses: 1
    Dernier message: 28/05/2013, 15h14
  2. [sfGuard] Questions diverses de débutant
    Par barbug dans le forum Plugins
    Réponses: 4
    Dernier message: 06/05/2011, 23h05
  3. [Débutant] Questions diverses
    Par thetataz dans le forum VB.NET
    Réponses: 0
    Dernier message: 16/09/2010, 14h22
  4. Petites questions diverses (débutant)
    Par elishac dans le forum Caml
    Réponses: 4
    Dernier message: 01/06/2009, 01h26
  5. Réponses: 6
    Dernier message: 21/04/2009, 09h57

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