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 :

Probleme avec un input file


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    PhD student
    Inscrit en
    Mars 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : PhD student
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 2
    Par défaut Probleme avec un input file
    Bonjour a tous,

    Excusez moi par avance pour les manques d'accents dans mon message, j'utilise actuellement un clavier qwerty au boulot

    Mon probleme est le suivant: j'ai un fichier de donnees "inputdata.dat" contenant deux colonnes (premiere colonne: nom des variables, deuxieme colonne: valeur de la variable). Je tente de lire ce fichier via mon script "TEST.f90" et d'assigner les valeurs de "inputdata.dat" a mes variables du script. Je demande ensuite de m'afficher les variables, avec leurs valeurs, sur l'ecran du pc.
    Apres execution, toutes les valeurs sont bien bonnes, a l'exception d'une variable que je ne parviens pas a afficher a l'ecran et que j'avais essayer de sauvegarder en tant que matrice.

    Voici les fichiers "inputdata.dat", le script "TEST.f90" ainsi que l'erreur obtenue:

    inputdata.dat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a	        7	2	4
    b		150
    vec1          1      2       3      4      5  
    vec2          6      7       8      9      10  
    c               56
    (l'agencement est bien realise dans mon fichier, il passe juste mal sur le site mais les valeurs sont: a = 7 2 4 (3 valeurs), b = 150, vec1 = 1 2 3 4 5, vec2 = 6 7 8 9 10, c = 56)

    TEST.f90

    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
    19
    20
    21
    22
    23
    program main
    implicit none
     
    character(16) :: cinput
    integer :: a0, a1, a2, b0, c0, i, j
    integer,dimension(:,:),allocatable :: gfd
     
        open(9,file='inputdata.dat')
        read(9,*) cinput,a0,a1,a2
        read(9,*) cinput,b0
        read(9,*) cinput,gfd(:,1)
        read(9,*) cinput,gfd(:,2)
        read(9,*) cinput,c0
        close(9)
     
        write(*,*) 'a0 =', a0, 'a1 =', a1, 'a2 =', a2, 'b0 =', b0, 'c0 =', c0
        do i=1,5
              do j=1,5
                 write (*,*) gfd(i,j)
              enddo
        enddo
     
    end program main
    OUTPUT ON THE TERMINAL

    a0 = 7 a1 = 2 a2 = 4 b0 = 150 c0 = 56

    Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

    Backtrace for this error:
    #0 0x7F0AA087D777
    #1 0x7F0AA087DD7E
    #2 0x7F0AA04D5CAF
    #3 0x7F0AA0946280
    #4 0x7F0AA0947820
    #5 0x7F0AA094B4AE
    #6 0x4010DD in MAIN__ at TEST.f90
    Segmentation fault (core dumped)


    J'ai egalement essayer d'afficher gfd en utilisant write(*,*) 'gfd =', gfd(:,1), mais j'obtiens la meme erreur (enfin pas d'erreur, mais rien de s'affiche).

    Je pense que je dois mal enregistrer la variable, mais je ne vois pas pourquoi.

    Je vous remercie si vous pouvez m'aider!
    ms518

  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
    Par défaut
    Tu ne peux pas faire la lecture et l'écriture de la variable "gfd" sans l'avoir d'abord allouée. Si tu ajoute un allocate(gfd(5,2)), tout devrait fonctionner. Enfin, ta boucle d'écriture sur "j" devrait aller de 1 à 2 et non de 1 à 5.

  3. #3
    Nouveau candidat au Club
    Femme Profil pro
    PhD student
    Inscrit en
    Mars 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : PhD student
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 2
    Par défaut
    Merci pour ta réponse Sylvain. Je viens d'essayer avec le allocate(gfd(5,2)) et ca marche impeccable.

    Une question supplémentaire sur le même sujet cependant: y-a-t'il un moyen d'utiliser la meme méthode lorsqu'on ne connait pas la taille de la matrice a l'avance? Par exemple, pouvoir utiliser exactement le meme script sans aucune modifications, avec un fichier inputdata contenant des vecteurs de taille plus grande?

  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
    Par défaut
    Il est possible qu'il y ait une solution en Fortran 2003, mais je ne connais pas vraiment.

    En Fortran 95, la solution qui est de loin la plus simple consiste à obtenir la dimension d'une lecture précédente (la dimension requise est écrite au début du fichier de données ou déduite des premières données lues), d'allouer, puis de lire. Si ce n'est pas possible, la solution est plus compliquée : Il faut lire la ligne contenant le vecteur dans une variable caractère suffisamment longue avec le format explicite 'a' (read(9,'(a)') Ligne), décoder la ligne, i.e. compter le nombre d'élément, allouer la variable, puis lire la ligne (read(Ligne, *) cinput,gfd(:,1)). La difficulté est dans le décodage... Voici un exemple (non testé) :

    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
     
    character (1000) Ligne
    integer NbVar
    logical EstBlanc, EtaitBlanc
    integer k
    ...
    read(9,'(a)') Ligne
    NbVar = 0
    EtaitBlanc = .false. ! pour ne pas compter le titre
    do k = 1, len_trim(Ligne)
       EstBlanc = Ligne(k:k) == ' ' .or. Ligne(k:k) == ',' .or. Ligne(k:k) == char(9) ! un séparateur est un blanc, un tab, une virgule, ...
       if ((.not. EstBlanc) .and. EtaitBlanc) NbVar = NbVar + 1 ! Début d'une nouvelle donnée
       EtaitBlanc = EstBlanc 
    enddo
    allocate(gfd(NbVar,2)
    read(Ligne, *) cinput,gfd(:,1)
    read(9, *) cinput,gfd(:,2)
    N.B. : ce code ne fonctionne pas s'il y a des tabulations multiples entre les données.

Discussions similaires

  1. [AJAX] .serialize avec des input files
    Par misakilou dans le forum AJAX
    Réponses: 1
    Dernier message: 30/10/2010, 20h39
  2. submit bizarre avec un input file.
    Par hibour dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 23/11/2009, 17h23
  3. Réponses: 3
    Dernier message: 07/10/2008, 11h13
  4. probleme avec un input de type image
    Par taka10 dans le forum Langage
    Réponses: 3
    Dernier message: 31/08/2006, 10h45
  5. Probleme avec les "input type="image" "
    Par khokho dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 26/03/2006, 17h12

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