bonjour,

J'ai un petit probleme avec mon programme Fortran. Il s'agit d'un incident de segmentation apparemment. Voici ce que me donne l'execution:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
makino{foti}91: ifort -o pollin3 pollin3.f90 trimod
makino{foti}92: pollin3
Incident de segmentation
Ca ne donne pas beaucoup de details concernant l'origine de l'incident! (notez qu'il n'y a pas de probleme a la compilation)

Ce programme traite deux fichiers ASCII de 6 colonnes chacun. Les premieres colonnes de ces fichiers sont des longueurs d'onde (lambda) qui servent d'abscisse. Seulement, l'echantillonage n'est pas le meme sur les lambdas des deux fichiers (ce que j'appelle lambda1 et lambda2 dans mon programme). Mon fichier sortie devrait avoir une seule abscisse lambda qui serait la combinaison des lambda1 et lambda2.
Pour cela, je voudrais concatener lambda1 et lambda2 et les trier dans l'ordre croissant pour former un lambda (dont le nombre d'elements est la somme de ceux de lambda1 et lambda2. De plus, je voulais creer des vecteurs lambda1x et lambda2x qui sont comme lambda1 et lambda2 mais avec le nombre d'elements de lambda.

En bref, j'ai ceci dans mon code:

lambda(:,1) =(/lambda1(:,1), lambda2(:,1)/)
lambda(:,2) =(/lambda1(:,2), lambda2(:,2)/)

lambda1x(:,1)=(/lambda1(:,1), lambda1(:,1)/)
lambda1x(:,2)=(/lambda1(:,2), lambda1(:,2)/)

lambda2x(:,1)=(/lambda2(:,1), lambda2(:,1)/)
lambda2x(:,2)=(/lambda2(:,2), lambda2(:,2)/)

j'ai oublie de mentionner que mes vecteurs lambda sont en fait des tableaux a deux lignes. Pour lambda1, la deuxieme ligne ne contient que des 1 et pour lambda2, elle ne contient que des 2. Ceci afin que chaque valeur que j'aurais dans mon lambda final conserve une trace de son origine.

Donc, le probleme a l'execution survient a la 3eme ligne du groupe que j'ai ecrit ci-dessus, c'est-a-dire lambda1x(:,2)=(/lambda1(:,2), lambda1(:,2)/)

Je ne comprends pas pourquoi il voit un probleme de segmentation la! Quelqu'un aurait-il une idee?

Je vous laisse le code complet ci-dessous:

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
 
program polarisation
 
use trimod
 
integer                    :: n,o,r
real                       :: inf,sup, num
real, parameter            :: pi=3.14159265
real, dimension (210000,2)   :: lambda1,I1,Q1,lambda2,I2,U2
real, dimension (6,420000) :: pollin
real, dimension (420000,2)   :: lambda, lambda1x, lambda2x, I,Q,U
 character(99)             :: inputfile1, inputfile2, outputfile
double precision           :: c=299792.458,lambda0
 
type *,'longueur d'' onde du laboratoire: '
read (*,'(f8.3)') lambda0
 
!---------------------------------------------------------------------------------------------------------------------------------------
 
!Choix du domaine spectral:
 
type *,"Choisissez votre domaine spectral (en nm, a 10^-2 pres): "
read (*,'(f5.2)') inf
read (*,'(f5.2)') sup
 
!Fichiers texte : 6 colonnes
!
!*****************************************************************************************************************
!*     Lambda(nm)       *     Stokes I     *     Stokes Q,U,V     *     N1     *     N2     *     erreur/bin     *
!*****************************************************************************************************************
!
!
!lecture du premier fichier texte
!********************************
type *,'inputfile 1 :'
read (*,'(a30)') inputfile1
 
OPEN  (UNIT =1,FILE =inputfile1,form='formatted',status="old",action='read')
 
n=1
o=1
do        
	read (1,'(f10.4)',end=100) lambda1(n,1)
	if (lambda1(n,1)>inf) then
		if (lambda1(n,1)<sup) then
			read (1,'(f10.4,2e12.8)') lambda1(o,1),I1(o,1),Q1(o,1)
			lambda1(o,2)=1
			o=o+1
		else 
			exit
		endif
	endif
	n=n+1
enddo
 
100 continue
 
!--------------------------------------------
!lecture du second fichier texte
!*******************************
type *,'inputfile 2 :'
read (*,'(a30)') inputfile2
 
OPEN  (UNIT =2,FILE =inputfile2,form='formatted',status="old",action='read')
 
!------------------------------------------
 
n=1
o=1
do        
	read (2,'(f10.4)',end=200) lambda2(n,1)
	if (lambda2(n,1)>inf) then
		if (lambda2(n,1)<sup) then
			read (2,'(f10.4,2e12.8)') lambda2(o,1),I2(o,1),U2(o,1)
			lambda2(o,2)=2
			o=o+1
		else
			exit
		endif
	endif
	n=n+1
enddo
 
200 continue
!------------------------------------------
 
!calcul polarisation lineaire pl=sqrt(Q**2+U**2) avec Q et U fraction de Ic
!tableau de sortie : pollin, 6 colonnes
!*************************************************************************
 
!********************************************************************************
!*     Lambda (nm)     *  I  *  Q  *  U  *    polarisation lineaire     * theta *
!********************************************************************************
 
print *,'***************************'
print *,shape(lambda1), shape(lambda2)
print *,'***************************'
 
 
 
 
lambda(:,1)  =(/lambda1(:,1), lambda2(:,1)/)
lambda(:,2)  =(/lambda1(:,2), lambda2(:,2)/)
 
print *,'***************************'
print *,shape(lambda)
print *,'***************************'
 
lambda1x(:,1)=(/lambda1(:,1), lambda1(:,1)/)
lambda1x(:,2)=1.
 
lambda2x(:,1)=(/lambda2(:,1), lambda2(:,1)/)
!lambda2x(:,2)=2.
 
! call tri( size(lambda),lambda  )
! call tri( size(lambda1x),lambda1x  )
! call tri( size(lambda2x),lambda2x  )
 
end program polarisation