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 chaine de caracteres en operation


Sujet :

Fortran

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut Convertir chaine de caracteres en operation
    Bonjour à tous,

    Je souhaitai savoir s'il était possible de convertir (sous FORTRAN) une chaine de caractères en opération.

    Par exemple: j'écris dans un fichier l'opération suivante:

    2*3/4*5

    Je souhaiterai lire la dite-opération dans un programme puis l'appliquer...

    Comment faire?

    Merci d'avance,

    Marlan

  2. #2
    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!
    Si je comprends bien ta question, ça veut dire que tu souhaite écrire un bout de compilateur. Alors, bonne chance!
    Jean-Marc Blanc

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    Effectivement dit comme ça...

    Tant pis, je ferai sans, merci quand même.

    Embrayons sur une autre question (histoire de ne pas avoir créé un topic pour rien): je souhaiterai maintenant que le programme puisse lire le répertoire courant. Pour ce faire, j'utilise la syntaxe:

    CALL system('pwd')
    La question est la suivante: comment faire pour stocker la chaine de caractères qu'il me renvoit (par exemple: /chemin/repertoire_courant) dans une variable de type character?

    Merci d'avance,

  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
    Question 1

    Ce que tu veux est un « expression parser ». J'en ai quelques uns (!) mais ils ne sont pas libres de droits.

    Il y a différents types de parser :
    • Ceux qui calculent directement le résultat d'expression contenant des valeurs et des fonctions (4*ln(10))
    • Ceux qui prennent un tableau de variables en entrée (en plus de l'expression) et qui remplacent les variables de l'expression pour calculer le résultat.
    • Ceux qui « compilent » l'expression contenant des variables et qui permettent ensuite de calculer l'expression en changeant successivement la valeur des variables.


    Fais une recherche google avec « expression parser fortran ».

    Il y en a un assez connu écrit par un australien (je crois), Stuart ????. Une recherche « expression parser fortran Stuart » devrait te permettre de le retrouver.

    Si tu veux le faire par toi-même, commence par le premier type. La stratégie commune consiste à avoir une fonction récursive retournant le résultat numérique de l'expression. Cette fonction trouve l'opérateur à exécuter et s'appelle elle-même (récursivement) avec les sous-expressions de gauche et de droite afin d'appliquer l'opérateur. La recherche d'opérateur doit tenir compte des parenthèses, et retenir celui qui a la plus basse priorité. Par exemple :

    decode("4*3 - 5*6") = decode("4*3") - decode("5*6")

    decode("4*3") = decode("4") * decode("3")

    Question 2

    Tu dois faire un CALL system('pwd > fichier'), puis open(unit,fichier), puis un read du fichier... et finalement un close delete.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    Salut,

    Tout d'abord, merci de tes réponses.

    J'aimerai revenir sur la réponse de la question 2. Je réalise les opérations suivantes:

    CHARACTER(40) :: NomFichier

    ...


    call system('pwd > NomFichier')

    print*, NomFichier

    open(1,file=NomFichier//'TEST.dat')

    ...

    CLOSE(1)
    Le soucis est qu'il n'ouvre pas le dit fichier, voir même n'inscrit pas le chemin d'accès dans la variable NomFichier: l'erreur renvoyée est la suivante:

    Image PC Routine Line Source
    TEST *** Unknown Unknown Unknown
    TEST *** Unknown Unknown Unknown
    TEST *** Unknown Unknown Unknown
    TEST *** Unknown Unknown Unknown
    TEST *** Unknown Unknown Unknown
    TEST *** Unknown Unknown Unknown
    TEST *** Unknown Unknown Unknown
    TEST *** Unknown Unknown Unknown
    TEST *** Unknown Unknown Unknown
    Où les *** sont des suites de nombres.

    Sauriez vous pourquoi?

  6. #6
    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
    Dans mon exemple, NomFichier se voulait le nom du fichier dans lequel la commande pwd allait écrire son résultat. Ce n'est pas une variable. Il n'est pas possible (à ma connaissance) de "piper" directement dans une variable le résultat d'une commande.

    Si on remplace NomFichier par ton "test.dat", on obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    character (200) :: Ligne
    ...
    call system('pwd > test.dat')
    open(11,'test.dat')
    read(11,'(a)',iostat=iostatus) Ligne
    print *, trim(Ligne)
    close(11, status='delete')
    ...
    Je ne connais pas le format du résultat de la commande pwd (je suis sur Windows). Il est donc possible que le résultat intéressant ne soit pas sur la première ligne. Si c'est le cas, il faudrait ajuster le code en conséquence.

    Dans ton code, tu utilises le unit 1 pour le fichier. Il est recommandé de ne jamais utiliser de unit < 10. J'ai donc utilisé 11 dans l'exemple.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    Oki merci bien!

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

Discussions similaires

  1. convertir a partir de chaine de caractere
    Par hammacom dans le forum Java ME
    Réponses: 1
    Dernier message: 24/07/2006, 08h26
  2. convertir un nombre en chaîne de caractères
    Par Calbane dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/04/2006, 20h12
  3. [VB]Convertir une chaine de caractere en entier
    Par budylove dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/02/2006, 11h06
  4. Convertir chaine de caractere
    Par Antoine NSG dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2005, 15h32
  5. convertir un nombre en chaine de caractere
    Par c_moi_c_moi dans le forum Oracle
    Réponses: 3
    Dernier message: 23/11/2005, 11h24

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