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 :

Convertir un logical unit number en file descriptor


Sujet :

Fortran

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Convertir un logical unit number en file descriptor
    Bonjour,

    Je suis en train d'écrire un programme en fortran qui appelle des fonctions en C.
    Le programme en fortran ouvre et écrit dans un fichier texte certains résultats, et je voudrais que les programmes en c contiunent à écrire dans ce fichier en le laissant ouvert le temps de l'exécution du programme.
    Le problème est que le fortran utilise un logical unit number pour identifier ce fichier alors que le c utilise un file descriptor.

    Comment convertir un logical unit number en file descriptor ?

    J'ai trouvé sur le net certaines fonctions : getfd, getfilep... qui ne fonctionnent pas chez moi.

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Comme c'est une extension au language, il faut utiliser les fonctions ajoutees par ton compilateur. g77 par exemple propose fnum. Voir la doc de ton compilateur, ou revoir la conception de ton programme.

  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
    Au delà du problème identifié par DaZumba (solution propriétaire), il y a le problème des buffers pouvant être distincts dans chaque librairie. Il est hautement recommandé d'éviter de faire des accès sur un fichier avec 2 langages distincts en même temps.

    Je te propose la solution suivante :
    • Fait toutes tes écritures en C.
    • En Fortran, au lieu d'écrire directement dans le fichier, tu écris dans des variables charactères
    • Tu écris les variables caractères Fortran en appelant une fonction C qui se chargera d'écrire directement la chaîne dans le fichier


    N.B. : Il ne faut jamais sous-estimer les problèmes pouvant découler des solutions propriétaires : il arrive toujours un jour où un programme doit être porté sur un autre système ou OS ou environnement, le tout devant être fait par une autre personne (qui n'y connait rien) et avec un autre compilateur (qui ne supporte pas l'extension)...

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci à vous deux pour vos réponses.

    Ta solution, Sylvain, me semble envisageable, même si elle n'est pas la plus simple.
    J'ai 9 fonctions en Fortran et 1 seule d'entre elles appelle une fonction en C. Il faudra faire toutes les écritures en C pour ces 9 fonctions si je veux écrire les résultats dans un seul et même fichier, donc d'avantage de mixe C-Fortran et un programme moins cohérent pour la personne qui continuera à programmer.
    Mais bon, je réfléchis quand même à cette éventualité, étant donné que je n'en ai pas d'autre.

  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
    La solution proposée n'est pas si lourde qu'elle en a l'air. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    write(20,30)VarA,VarB,VarC,...
    ...
    Devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    character (AssezLong) Buf
    ...
    write(Buf,30)VarA,VarB,VarC,...
    call EcritViaC(Buf)
    ...
    et tu ajoutes la subroutine EcritViaC qui est la seule à faire le véritable appel à C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    subroutine EcritViaC(S)
       character (*), intent(in) :: S
       appelle C pour écrire...
    Une alternative : tu fais exactement le contraire. Tu modifies uniquement la partie C actuelle pour qu'elle retourne la chaîne à imprimer à Fortran plutôt que de l'impimer elle même...

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    oui, ok, c'est fait et ça fonctionne. Le problème est réglé!

    C'était un peu compliqué au départ parce que je développe sous Open VMS sur un serveur alpha. Il a donc fallu que je me familiarise avec les descripteurs.

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

Discussions similaires

  1. lire une ligne d'un file descriptor
    Par Pitou5464 dans le forum Réseau
    Réponses: 4
    Dernier message: 30/10/2006, 16h13
  2. pb file descriptor
    Par aimad41 dans le forum C
    Réponses: 2
    Dernier message: 23/10/2006, 18h16
  3. Coment obtenir le nombre total de file descriptor ouvert?
    Par homeostasie dans le forum Réseau
    Réponses: 7
    Dernier message: 21/06/2006, 11h55
  4. Bad file descriptor avec un read()
    Par je®ome dans le forum C
    Réponses: 2
    Dernier message: 04/04/2006, 19h30
  5. Etrange "Bad file descriptor"
    Par amauryxiv dans le forum Langage
    Réponses: 23
    Dernier message: 01/02/2006, 03h20

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