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 :

Code réentrant, variables sauvegardées, librairie et exécutable


Sujet :

Fortran

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Points : 34
    Points
    34
    Par défaut Code réentrant, variables sauvegardées, librairie et exécutable
    Salut à tous,

    J'ai un code Fortran, qui calcule et simule l'état d'un système donné initialement. Ce code fait appel à des variables permanentes (variables sauvegardées entre les différentes entry de subroutines) et des variables globales (via des common).

    Aujourd'hui on me demande d'intégrer ce code au sein d'un programme (C/Fortran) qui doit pouvoir s'en servir pour calculer et simuler l'état d'un nombre quelconque de systèmes à la fois (système 1 d'une part, système 2 d'autre part, etc). Il faut donc pouvoir, à chaque pas de temps de la simu d'ensemble, calculer la mise à jour du système 1, puis la mise à jour du système 2, etc.

    (Bien sûr les différents systèmes auront des interactions les uns avec les autres extérieures à mon code, donc on ne peut pas faire entièrement toute la simu temporelle du système 1, puis du système 2, etc.)

    Bien sûr en l'état ça ne peut pas marcher à cause des variables internes permanentes qui sont censées toujours concerner le même système initial.

    Il y a des solutions bateau : tout passer en paramètre (lourd dans mon cas), ou rajouter une dimension aux variables permanentes (lourd aussi, surtout s'il faut créer un n+1 ème système au milieu de la simu). J'aimerais autant éviter ces solutions car mon code est déjà utilisé dans différentes simulations qui n'en ont pas du tout le besoin (ce besoin est réellement complètement exceptionnel dans mon cas), et dans la mesure du possible je ne souhaite pas vivre avec cette contrainte supplémentaire dans l'ensemble de mes programmes.

    A priori, je cherche donc plutôt une solution qui me permettrait d'utiliser mon code tel quel, ie qui permette d'une façon ou d'une autre d'en lancer les fonctions en créant un espace mémoire dédié (au 1er appel de chaque système), puis en se replaçant dans cet espace mémoire aux prochains de appel de ce système.

    Y a-t-il des solutions à mon problème ?

    - J'imagine qu'en "codage pur", ce n'est pas possible : ie pas de fonction interne à gfortran/gcc (appel possible en C) qui permette de dire "prochain appel de telle fonction, tu le fais dans un nouvel espace mémoire" puis "prochain appel, tu le fais dans l'espace mémoire n° k" ?

    - Peut-être mon problème trouve-t-il une solution si je passe mon code dans une librairie ou exécutable. L'idée étant qu'à chaque nouveau système 1,...,n, le programme principal irait lancer une nouvelle fois la librairie/exécutable, et devrait ensuite pouvoir être capable, au pas de temps suivant, d'aller commander "la suite" à la bonne instance de la librairie ou de l'exécutable (donc déjà lancé cette fois, et qui était en attente de nouvelles instructions).

    Cela est-il faisable, d'une façon ou d'une autre ? Je pense que la solution "nouvelle instance de l'exécutable pour chaque nouveau système" doit au moins pouvoir marcher. Je n'ai jamais lancé d'exécutable depuis un autre code, mais j'imagine que pas de souci ; peut-être plus sur le "maintien des échanges" par la suite. Enfin j'imagine qu'en C au moins ça doit pouvoir se faire ? Est-ce qu'une telle solution introduit de gros overhead (ordre de grandeur en temps ?) au moment du "passage de témoin" vers et depuis l'exécutable qui contiendra mon code ?

    Quelle est selon vous la meilleure façon pour moi de procéder ? Et comment ?

    Merci beaucoup 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
    Points : 1 346
    Points
    1 346
    Par défaut
    Une tentative...

    Certaines variables, que tu dis permanentes, ne sont pas dans un common. Si tu plaçais toutes ces variables permanentes dans un common, tu n'affecterais pas le fonctionnement du code.

    De là, tu définis des types correspondant au contenu des commons. Tu peux donc ajouter 2 routines à ton code : SauveVariables(Image) servant à prendre une copie des commons, et RemplaceVariables(Image) servant à remplacer le contenu des commons. Reste à vectoriser Image (tableau, liste liée, ...).

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Points : 34
    Points
    34
    Par défaut
    Comme tu dis : c'est une possibilité.

    - soit je fais un gros common qui regroupe toutes celles n'étant pas déjà dans un common (mais alors échec de la méthode si jamais j'ai deux routines qui ont chacune des variables internes de même nom)
    - soit un common par routine : sans doute viable dans cette implémentation mais un peu pénible

    La deuxième semble viable mais cela revient là encore à faire une version spécifique du code. Ce que je souhaite éviter. Néanmoins, s'il n'y avait pas moyen de faire autrement, je pense que ce serait la moins mauvaise des solutions.

    Je retiens ; en attendant je poursuis toujours la piste exécutable à "instancer"...

  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
    Pour aider ta recherche de solution...

    Un common n'a pas à avoir les mêmes variables (ni les mêmes noms, ni les mêmes types) dans chaque routine où ils sont accédés : c'est la position dans la liste et la longueur (en octets) qui compte. Tu pourrais donc utiliser cette caractéristique pour éviter les conflits de nom.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,

    Une autre possible piste, vu ce que tu cherches à faire, regarder du côté de ce qu'on appelle les "coupleurs", justement fait pour faire discuter des codes entre eux.
    Du genre OPenPalm ou OASIS , mais il y en a possiblement d'autres; c'est un domaine que je connais peu.

    Bon courage.

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/12/2006, 14h41
  2. Insérer du code dans un classeur et l'exécuter
    Par spileo dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/09/2006, 19h13
  3. Réponses: 2
    Dernier message: 19/06/2006, 22h55
  4. Variables dans un .sql exécuté par sqlplus
    Par ekke dans le forum Oracle
    Réponses: 10
    Dernier message: 12/04/2006, 17h03
  5. Réponses: 10
    Dernier message: 06/10/2005, 22h25

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