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 :

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


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Points : 18
    Points
    18
    Par défaut Liste erreur : Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
    Bonjour à toutes et à tous,

    Je suis en train de créer une programme qui manipule une liste de points de coordonnées (x,y). Pour cela j'utilise deux modules :
    - modPoint : manipulant les coordonnées de chaque point (avec des set et des get)
    - modListePoints : manipulant la liste de points

    J'ai créé une fonction dans mon second module qui permet de créer une liste de points. Dans un premier temps, cette fonction demande à l'utilisateur d'entrer le nombre de point dont il dispose puis une boucle do permet à l'utilisateur d'entrer les abscisses et les ordonnées pour tous les points.

    Lorsque je compile mon programme, je rencontre une erreur que je n'avais jamais vu jusqu'à maintenant. Vous trouverez mon erreur sous forme de capture d'écran en pièce jointe.
    Ce qui est étrange, c'est que je peux entrer le premier point de ma liste mais impossible d'entrer les suivants.

    Voilà la partie de mon module modListePoints concernée par l'erreur (enfin je pense^^) :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
     
    subroutine creer_liste(this)
      class(liste) :: this
      integer :: IO_ERROR, n, i
      real :: x,y
      type(point), pointer :: nouveau_point, dernier_point
     
     
      write(*,"('Entrer le nombre de points dont vous disposez :')")
     
    ! Ci-dessous la gestion des erreurs pour la valeur de n entrée par l'utilisateur
     
      do
         read(*,IOSTAT=IO_ERROR,FMT="(i5)") n
         if(IO_ERROR .EQ. 0) exit
         write(*,"('Entree incorecte, entrer un entier en format i5. Merci.')",advance='no')
      end do
     
      do while ((n.EQ.0).OR.(n.LT.0))
         write(*,"('Erreur : le nombre de points ne peut pas etre inferieur ou egal a zero. n =')",advance='no')
         do
            read(*,IOSTAT=IO_ERROR,FMT="(i5)") n
            if (IO_ERROR .EQ. 0) exit
            write(*,"('Entree incorecte, entrer un entier en format i5. Merci.')",advance='no')
         end do
      end do
     
    ! Fin de la gestion des erreurs
     
    !Boucle do allant de 1 à n (n =nombre de points dont on souhaite entrer les coordonnées dans la liste). Pour chaque itération, l'utilisateur va entrer l'abscisse et l'ordonnée du point.
     
      do i=1,n
         write(*,"(10x,'Point',x,i3,x':')") i
         write(*,"('Entrer abscisse :')")
     
    !Gestion des erreurs pour la valeur de x entrée
         do
            read(*,IOSTAT=IO_ERROR,FMT="(f5.2)") x
            if(IO_ERROR .EQ. 0) exit
            write(*,"('Entree incorecte, entrer un reel en format f5.2. Merci.')",advance='no')
         end do
     
         write(*,"('Entrer ordonnee :')")
     
    !Gestion des erreurs pour la valeur de y entrée
         do
            read(*,IOSTAT=IO_ERROR,FMT="(f5.2)") y
            if(IO_ERROR .EQ. 0) exit
            write(*,"('Entree incorecte, entrer un reel en format f5.2. Merci.')",advance='no')
         end do
     
     
         call allouer_nouveau_point(nouveau_point) ! On créé  un espace mémoire pour notre nouveau point à partir de la subroutine allouer_nouveau_point.
     
    ! On entre les coordonnées et le numéro du point
         call nouveau_point%set_x(x)
         call nouveau_point%set_y(y)
         call nouveau_point%set_num(i)
     
    ! On ajoute le nouveau point dans la liste :
         if ( this%est_vide() ) then
            call this%set_tete(nouveau_point)
         else
            dernier_point => this%get_tete()
            do while ( dernier_point%suivant_estAssocie() )
               dernier_point => dernier_point%get_suivant()
            end do
            call dernier_point%set_suivant(nouveau_point)
         end if
     
         call this%incrementer_taille()
      end do
     
      return
    end subroutine creer_liste
     
     
    subroutine allouer_nouveau_point(nouveau_point)
      type(point), pointer :: nouveau_point
     
      allocate(nouveau_point)
      nullify(nouveau_point)
     
      return
    end subroutine allouer_nouveau_point
    Et voilà la déclaration du module modListePoints :
    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
    24
    25
    26
    27
    28
     
    module modListePoints
     
    use modPoint
     
    implicit none
     
    public :: liste
     
    type liste
       integer, private :: taille
       type(point), pointer, private :: tete
    contains
      procedure, public :: set_taille, set_tete, setTete_annul
      procedure, public :: get_taille, get_tete
      procedure, public :: est_vide
      procedure, public :: creer_liste_vide
      procedure, public :: creer_liste
      procedure, public :: afficher_liste
     
      procedure, private :: incrementer_taille
      procedure, nopass,  private :: allouer_nouveau_point
    endtype liste
     
    contains
    .
    .
    .
    Merci d'avance pour votre aide,

    Cdt.
    Images attachées Images attachées  

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Je viens de trouver l'erreur, en faisant un peu "d'archéologie"...
    L'erreur provient du nullify(nouveau_point) dans la subroutine allouer_nouveau_point.

    Je ne sais absolument pas pourquoi cela peut être source d'erreur... Lorsqu'on alloue un nouvel élément dans une liste, je trouve normal de "nullifier" le suivant car on ne peux pas avoir un pointeur qui pointe sur rien...
    Est ce que quelqu'un pourrait m'éclaircir ?

    Merci !

    Finalement l'erreur apparait toujours... je ne sais pas du tout d'où elle sort. Je désespère.

  3. #3
    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,

    Ca plante sans autre message d'erreur, même en utilisant toutes les options de débogage du compilateur?

    Je ne suis pas un habitué des pointeurs en Fortran mais il me semble me souvenir que l'instruction "nullify" sert à dé-associer un pointeur de sa cible; du coup je ne vois pas l’intérêt d'enchainer cette instruction avec l'allocation: on se débarrasse de ce que l'on vient de créer...

Discussions similaires

  1. signal sigsegv segmentation fault
    Par plus1 dans le forum C
    Réponses: 11
    Dernier message: 11/11/2013, 22h35
  2. Réponses: 2
    Dernier message: 23/04/2012, 23h07
  3. Réponses: 2
    Dernier message: 07/03/2010, 00h20
  4. Réponses: 0
    Dernier message: 10/01/2008, 23h28
  5. Réponses: 15
    Dernier message: 15/04/2007, 13h31

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