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 :

Problème d'enregistrement mémoire


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut Problème d'enregistrement mémoire
    Bonjour

    Ce n'est pas la première fois que j'ai ce genre de problème et je ne sais pas comment les corriger.

    J'ai un tableau déclaré dans un module. Dans une subroutine d'un programme je remplis ce tableau, puis je m'en sert un peu plus loin dans la même subroutine. Le problème c'est que si entre le moment où je le remplis et le moment ou je m'en sert je ne l'imprime pas dans un fichier, ça plante. Là ou je m'en sert après un certain nombre d'itération ça fait n'importe quoi. Je sais que le fait de l'écrire dans un fichier ça force quelque chose par rapport à l'écriture en mémoire. Mon problème c'est que :

    1) Comment détecter ce genre d'erreur ? Y a t il des options de compilation ?

    2) Quel est l'origine et comment les régler ?

    Merci de votre aide

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    il est possible que cela provienne d'un dépassement de tableau. par défaut les compilateurs fortran ne vérifient pas les prototypes des fonctions/subroutines. Sur certains compilateurs on peut forcer la vérification de la taille des tableaux lors des appels avec une option qui ressemble à --check=all. Le problème c'est que chaque compilateur est différent dans ce cas.

    Par exemple, dans un cas de dépassement de tableau classique, très souvent on a un message d'erreur du type "out of range error" voire une "segmentation fault". cela se produit lorsque que tu essaies d'accéder à une adresse mémoire depuis un tableau qui dépasse la définition du tableau. Seulement 2 cas de figures peuvent intervenir: soit la plage mémoire à laquelle tu veux accéder a été réservé à ton programme par ton os, soit elle ne l'a pas été. C'est dans le second cas que tu vas avoir une erreur levée à l'exécution. Dans le premier cas tu ne l'auras pas et on observe en général des choses très bizarres (ce qui a l'air d'être ton cas): c'est à dire que tu crois lire une "case" mémoire avec un entier alors qu'il y a une chaine de caractères dedans. Ce que je dis n'est peut être pas une généralité, mais c'est ce que j'ai observé sur mon os/compilo.

    ce que je peux te proposer, c'est de construire un bloc interface pour les routines qui sont appelées (je suppose que tu es en fortran 90 puisque tu parles de module) ou mieux, tu mets chacune de tes routines dans un module (ça construit un bloc interface automatiquement). A présent, à la compilation, tu auras une vérification systématique des prototypes d'appel, et par la même occasion, tout un tas de nouveaux petits mots doux de ton compilateur

  3. #3
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Merci pour ton conseil, je vais essayer mais c'est quand même un peu lourd ...

    J'ai essayé de compiler avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifort -C -g -traceback -i_dynamic -o exe crystal_contact.f90
    le -traceback me donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    forrtl: warning (402): fort: (1): In call to I/O Write routine, an array temporary was created for argument #4
    Mais je comprend pas car mon tableau n'a que 3 argument

    Voici le write en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    write(10,"('ATOM',i7,a5,1x,a4,a1,i4,4x,3F8.3)")iat,at_name(iat), &
                            res_name(iat),chain(ic),ires(iat),(x(iw,iat,k),k=1,3)
    Je pense que le problème vient de x qui est déclaré dans un module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double precision,dimension(20,nat,3)::x
    ...

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    le tableau x qui est déclaré dans un module, il est modifié par plusieurs routines ? si oui, j'aurais tendance à lui donner l'attribut save à la déclaration.

    autre question, tu es sûr que le message de ton compilo parle de x et non pas d'un autre tableau de l'instruction write ?

  5. #5
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    En fait le warning du write c'était juste parcequ'ifort n'aime pas cette façon d'écrire :

    write(*,"(3F8.3)")trans( : )

    mais préfère

    write(*,"(3F8.3)") ( trans(k) , k=1,3)

    ....

    Sinon, j'ai trouvé l'erreur ailleurs, en fait j'écrasais le tableau à un endroit par mégarde !

    Je connais pas l'attribue save, c'est quoi ?

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    un peu plus d'info ici sur SAVE

    http://pages.swcp.com/~walt/fortran_...ks/t90_82.html

    personnellement je m'en sers lorsque je déclare une variable qui n'est pas un paramètre (PARAMETER) dans le corps même d'un module. Cela fait une variable globale, accessible à toutes les routines qui utilisent le module et ces mêmes routines peuvent modifier cette variable.

    mais il m'arrive aussi d'utiliser le SAVE implicit (integer:: count=0 par exemple) pour conserver la valeur d'une variable dans une routine entre deux appels successifs.

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

Discussions similaires

  1. Problème d'enregistrement de DLL
    Par chleuh dans le forum Langage
    Réponses: 5
    Dernier message: 01/07/2005, 10h30
  2. problème d'enregistrement de textarea dans bdAccess
    Par pmboutteau dans le forum ASP
    Réponses: 23
    Dernier message: 04/04/2005, 15h10
  3. Problèm d'enregistrement
    Par ludogim dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/06/2004, 11h41
  4. Réponses: 25
    Dernier message: 16/07/2003, 20h41
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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