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 :

Erreur de segmentation


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 40
    Par défaut Erreur de segmentation
    Bonjour à tous,

    Je fais actuellement un stage où j'essai d'interfacer du fotran et du python.
    Je souhaite récupéré un tableau passé en paramètre entre autres et lorsque j'augmente les dimension de ce tableau, j'obtiens une erreur de segmentation.

    Voici le code :
    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
     
    C -*- f90 -*-
     
    !=====================================================================
    !   ECRIPROJ.F   version 1.0 du  07/2010
    !
    !Ecriture des projections calculé algébriquement
    !dans un fichier binaire
    !
    !========-=========-=========-=========-=========-=========-=========-=
    !========-=========-=========-=========-=========-=========-=========-=
            SUBROUTINE EXECUTABLE(ia,b,c,d,e,f,g,h,i,j,k,
          &l,m,n,o,p,q,r)
    ! a= TAB
    ! b=date et heure
    ! c=nPixCol
    ! d=rayGir
    ! e=nAng
    ! f=larCha
    ! g=rayCach
    ! h=prof1
    ! i=prof2
    ! j=prof3
    ! k=larg1
    ! l=larg2
    ! m=larg3
    ! n=angInc
    ! o=startAng
    ! p=profC
    ! q=nbLig
    ! r=nbCol
            INTEGER, INTENT(IN) :: c,e,f,h,i,j,k,l
    !      REAL, INTENT(IN) :: d,g
           CHARACTER (LEN=40) :: b
            INTEGER :: m,n,o,p
           INTEGER :: q,r
           DIMENSION ia(q,r) 
     
            CALL ECRIPROJ(ia,b,c,d,e,f,g,h,i,j,k,
          &l,m,n,o,p,q,r)
     
           RETURN
           END SUBROUTINE EXECUTABLE
     
    ! !========================================================================
            SUBROUTINE ECRIPROJ(ITAB,date,nPixCol,rayGir,nAng,larCha,
          &rayCach,prof1,prof2,prof3,larg1,larg2,larg3,angInc,
          &startAng,profC,nbLig,nbCol)
     
    !========================================================================
    ! Fichier contenant l'ensemble des parametres principaux ================
           INCLUDE "param2D.f"
     
    ! Déclaration des variables
    !       INTEGER, INTENT(IN) :: larCha,nAng
           INTEGER, INTENT(IN) :: nbCol,nbLig
    !       INTEGER, INTENT(IN) :: nPixCol,prof1
    !       INTEGER, INTENT(IN):: prof2,prof3,larg1,larg2,larg3
    !       INTEGER, INTENT(IN) :: angInc, startAng,profC
            TYPE (paramfichier) ::  ParamFic
            TYPE (collimateur)  ::  ParamCol
           TYPE (geomacquis) ::    ParamAcq
           TYPE (deconvolution) :: ParamDec
           CHARACTER*150 FICPRJ
            REAL, INTENT(IN) :: rayGir,rayCach
           INTEGER :: NENRG
           INTEGER*4 :: TailleEnreg
           CHARACTER (LEN=40), INTENT(IN) :: date
           INTEGER :: I,J,m,n,s,t
           DIMENSION ITAB(nbLig,nbCol)
           DIMENSION IRECU(256,256)  
     
    !================== initialisation des données  ===============================
     
            Call InitEntetePy(ParamFic,ParamCol,ParamAcq,ParamDec,date)
           print* , date
           print* ,'nb lignes : ',nbLig
           print* ,'nb colonnes : ',nbCol
           TailleEnreg   = 4*256
    !        angInc=90
    !        startAng=0
    !        profC=12
    !        nPixCol = 5
    !        rayGir=15.0
    !        prof1=8
    !        prof2=0
    !        nAng=4
    !        larCha=130
    !        rayCach=3.8
    !        prof3=0
    !        larg1=15
    !        larg2=0
    !        larg3=0
           occ=0
           I=0
           J=0
           m=0
           n=0
           s=0
           t=0
           FICPRJ= 'image.proj'
           NENRG=0
     
    !        print* ,'rayon giration = ', rayGir
    !        print* ,'rayon de cache = ',rayCach
    !        print* ,'Pixel du collimateur = ', nPixCol
    !        print* ,'profondeur = ', prof
    !        print* ,'nb angle = ',nAng
     
    ! ==============================================================================
    ! Initialisation de l'entete collimateur ------------------------------------------------
           ParamCol%NB_TYPE_TROU = nPixCol
           ParamCol%LAR1  = larg1
           ParamCol%LAR2 = larg2
           ParamCol%LAR3 = larg3
           ParamCol%PROF1 = prof1
           ParamCol%PROF2 = prof2
           ParamCol%PROF3 = prof3
    ! Initialisation de l'entete Geometrie acquisition--------------------------------------
           ParamAcq%NB_ANG = nAng
           ParamAcq%INC_ANG = angInc
           ParamAcq%NSTART = startAng
           ParamAcq%IRAYORBI = rayGir
           ParamAcq%IRayon = rayCach
           ParamAcq%LARCHA = larCha
           ParamAcq%IPRCHA = profC
    !==============================================================================
           ParamFic%Dimension = 3
           ParamFic%IncPas(1) = 1
           ParamFic%IncPas(2) = 1
           ParamFic%IncPas(3) = nAng
           ParamFic%DebPas(1) = 1
           ParamFic%DebPas(2) = 1
           ParamFic%DebPas(3) = ParamAcq%NSTART
           ParamFic%Var(1) = 'X'
           ParamFic%Var(2) = 'Y'
           ParamFic%Var(3) = 'A'
           ParamFic%NbrPas(1) = larCha
           ParamFic%NbrPas(2) = ParamCol%LAR1+ParamCol%LAR2+ParamCol%LAR3
           ParamFic%NbrPas(3) = nAng
           ParamFic%NbrEnrEnt = 4
           ParamFic%TailleEnreg = TailleEnreg
     
     
    ! ================== Construction du nom de fichier ============================
     
     
    ! ================== Ouverture du fichier de sortie proja =======================
     
    ! ~~~~~~~~~~~~~  Preparation de l'entete General ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     
           ParamFic%FormatEnreg = "R4"! Format des donnees(I4,I8,R4,R8,C8,C16,..).
           ParamFic%DrapeauEnt = "ENT2010"!  nom de la version de l entete
           ParamFic%Drapeau = "cacao-proj"! Mot Magique (cacao-proj,cacao-psd,...)
           ParamFic%Date= date
           ParamFic%NbrEnrTot = ParamFic%NbrEnrEnt
         & +nbLig*nbCol ! Nombre Total d'enregistrements.
           ParamFic%FicBin=FICPRJ
           ParamAcq%SUJET = ParamFic%FicBin
     
           OPEN(UNIT=10,FILE=FICPRJ,FORM='UNFORMATTED',RECL=TailleEnreg,
         & STATUS='NEW',ACCESS='DIRECT')
     
     
    ! ~~~~~~~~~~~ Ecriture de l'entete dans le fichier de sortie proj ~~~~~~~~~~~~~~
     
           WRITE (1,REC = 1)  ParamFic
           WRITE (1,REC = 2)  ParamCol
           WRITE (1,REC = 3)  ParamAcq
           WRITE (1,REC = 4)  ParamDec
           NENRG = 4
     
          DO m = 1,nbLig
             DO n = 1,nbCol
                IRECU(m,n)=0
             END DO
          END DO
     
    ! ~~~~~~~~~~ Récupération des projections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     
     
          DO s =1, nbLig
             DO t = 1, nbCol
                IRECU(s,t)=ITAB(s,t)
                print *,'ligne ',s
    	    print *,'colonne ',t
             END DO
          END DO
     
    ! ~~~~~~~~ Ecriture des projections dans le fichier de sortie proj ~~~~~~~~~~~~~
     
           print* ,'Lancement de lécriture dans le fichier ',FICPRJ
           print* ,'Nb enregristrement total', ParamFic%NbrEnrTot
           DO J = 1 , nbLig
              DO I =  1 , nbCol
                 NENRG = NENRG + 1
                 !on écrit les résultats des projections dans le fichier de sortie
                 WRITE (10, REC=NENRG) IRECU(J,I)
              END DO
           END DO
    !        print* ,'ParamFic%TailleEnreg : ',ParamFic%TailleEnreg
    ! ================== Fermeture du fichier de sortie proja ======================
           CLOSE(10)
           print* ,'Le fichier a bien été créé'
           RETURN
           END SUBROUTINE ECRIPROJ
    L'erreur se trouve au niveau d'ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          DO s =1, nbLig
             DO t = 1, nbCol
                IRECU(s,t)=ITAB(s,t)
                print *,'ligne ',s
    	    print *,'colonne ',t
             END DO
          END DO
    Savez-vous d'où peut venir l'erreur?
    Je fais appele à executable depuis mon programme à l'aide de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    executable(Proj,str(now),int(d),float(rayonGiration),int(nbdAngles),int(larChamp),float(rayonCache),int(p1),int(p2),int(p3),int(larg1),int(larg2),int(larg3),int(incAng),int(angDebut),int(profChamp),int(dim1l),int(dim2c))
    Merci à tous ceux qui répondront!
    Cordialement,

  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
    Une erreur de segmentation, c'est généralement une tentative d'adressage d'un tableau avec un indice en dehors de la dimension du tableau.

    La probabilité est très forte que ce soit un problème de passage de paramètres d'un langage à l'autre. Je te suggère donc d'afficher tes paramètres dès le début de la subroutine Fortran, en prenant soin d'afficher d'abord les scalaires, puis les tableaux.

    De plus, je remarque que tu passes une variable caractère. La majorité des compilateur Fortran s'attendent à ce que la longueur de la variable soit passé "par valeur" à la fin de la liste de variable. C'est fait de façon transparente du point de vue Fortran. Quand tu passe de Fortran à Fortran, tout est transparent; tu n'as pas à en tenir compte. Mais quand tu mélange Fortran et autre chose, tu dois en tenir compte.

    Finalement, quand on "mixe" Fortran et autre chose, il faut absolument ouvrir son manuel...

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 40
    Par défaut
    Les paramètres sont bons nbLig et nbCol sont juste donc je ne comprend pas pourquoi. En plus, j'ai remarqué qu'il ne s'arretait jamais au meme endroit...

    J'ai réduit le problème à trois paramètres : le tableau et ses dimensions (nbLig et nbCol) et j'obtient toujours l'erreur de segmentation pour des valeurs d'environ 120.

  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
    As-tu tenu compte du fait que les dimensions des tableaux sont généralement inversées en Fortran par rapport aux autres langages ?

    Par exemple, un tableau C de dimension [5][7] et adressé [i][j] correspond à un tableau Fortran (7,5) adressé (j,i) (ou plutôt (j+1,i+1) à cause des origines différentes).

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 40
    Par défaut
    En effet, je n'avais pas pensé à ça. Je vais me renseigner.
    Une chose m'intrigue puisque même lorsque je fixe la tableau IRECU à 256x256 l'erreur de segmentation survient.

  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
    Par défaut
    Citation Envoyé par Dreyliciouss Voir le message
    Une chose m'intrigue puisque même lorsque je fixe la tableau IRECU à 256x256 l'erreur de segmentation survient.
    C'est en effet intrigant. Les tableaux Python sont-ils en origine 1 ou 0 ? L'erreur se produit-elle avec l'indice 256 ou avant ?

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

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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