"Segmentation Fault (core dumped)" Fehler im Fortran-gfortran linux
Erstelle ich ein Programm, das Ihnen die analyse einer Datei .passt in ein Verzeichnis und dann wird es eine neue Datei erstellen .txt in ein anderes Verzeichnis. Es ist nur ein Konverter.
Als ich versuchte, führen Sie das Programm aus (Zusammenstellung OK ist) es gibt mir eine Fehlermeldung:
Program received signal SIGSEGV: Segmentation fault " - Ungültiger Speicherzugriff.
Backtrace für diesen Fehler:
0 0x7FC5ADB1C117
1 0x7FC5ADB1C6F4
2 0x7FC5AD46C0AF
3 0x44E704 in ffthdu bei fitscore.c:6893
4 0x405101 in MAIN__ bei Codigo.f90:?
Segmentation fault (core dumped)
Und es gibt eine weitere information: wenn ich löschen Sie eine Strecke von dem Programm, das die "schreiben an die neue .txt Konverter-Datei" Teil, das Programm läuft gut und es liest sich das ganze .fits-Datei! Hier ist die Strecke:
arq='spec-1.txt'
open (29,file=arq,status='unknown')
write(29,*) ' l(n) fa(n)'
do n=1,naxes
write(29,*) l(n), fa(n)
end do
Habe ich deklariert die variable "arq" als ein Zeichen und alles ist OK. Wenn ich löschen dieser Strecke der "segmentation fault" erscheint nicht mehr, aber ich weiß nicht, was jetzt zu tun, da muss ich weiterleiten der Informationen an diese .txt! Und die "arq" - string ist nicht vollständig, da ich nur testen jetzt, später werde ich noch hinzufügen, das gesamte Verzeichnis.
Und hier das volle Programm, ich bin mit "gfortran Codigo.f90 -a-TESTE -Lcfitsio -lcfitsio", um es zu kompilieren:
implicit none
integer largo,status,hdnum,n,keysexist,keysadd,bitpix,naxis
integer naxes,readwrite,blocksize
integer i,j,k
integer iF(3),iT(3),iw(3),iwe,il,ib,jb,iFold,iFoldmin(3)
integer iFoldmax(3),iFoldopt(3)
integer iMiMy,iMo,Tymin,Tymax,Timin,Timax,Tyoung(3),Tint(3),Told
integer i912,i45000,Tyin,Tiin,nrows,ncols,datacode,repeat,width
integer nlam_ext
integer fKD,fKK,fKKD
parameter (nlam_ext = 1145)
CHARACTER NAMECH*256,name2*256,alibi*1000,card*80,code*14
CHARACTER arq*1000
CHARACTER name(7)*256,namein*256,nebname*256,nameout*256
CHARACTER nameindva*256,nameoutdva*256,mid(3)*4,line*1000
real fa(10000),fcs(10000),noiz(10000),mask(10000)
real*8 l(10000)
real*8 w_ext(nlam_ext),alam_ext(nlam_ext)
REAL*8 F(3,7),T(3,35),Fl(3,7,36,6900),w(3,6900),y(6900),ye(6900)
REAL*8 SN(6900),xe(6900)
real*8 CHISQU,CHISQUmin(3),CHISQUup,CHISQUdown,CHISQUmid,nf,nfup
real*8 nfdown,nfmid,nfopt(3)
real*8 t4020,y4020,i4020,o4020,t4860,y4860,i4860,o4860
real*8 xd(10000),yd(10000),absorb,ebminv,ke,redshift
real*8 xf(10000),yf(10000),yp(10000)
real*8 x(6900)
real*8 flueks(10000),extcurve(10000)
real*8 xg,yg(10000),x2,y2(10000)
REAL*8 sng,ewa,ewb,ewg,hha,hhb,oldage(3)
REAL*8 Mo(9),MiMy(9),Myoung,Mint,Mold,Myopt(3),Miopt(3),Moopt(3)
REAL*8 Fyoung,Fint,Fold(7),Noise
real*8 a,b,c, plyus,minus,xx,nebemm(6900),yy(6900)
real*8 Flyoung(6900),Flint(6900),Flold(6900)
real*8 ha,Oiii4959,Oiii5007,Nii,Nii2,Sii6717,Sii6731,Oii3727,Hei
real*8 hhg,hg,Oiii4363,Oii7319,Oii7330,Nii6548,Nii6584
real*8 R23,R3,P,XNII,xis,yps,O3N2,R,Z,k0,k1,k2,q,logq
real*8 OHNII,OHZ,OHMcG,OHP,OHKD,I2lOH,OHKK
real*8 OHKKD,OHKKbe,OHPPN2,OHPPO3N2,OHP05,I2lOHbef
logical anynull
ebminv = 0.
namech='/home/matheus/Desktop/IC/Spectra/Elliptical/spec-0266-51602-0467.fits'
write(6,*)namech
readwrite=0
status=0
call ftopen(17,namech,readwrite,blocksize,status)
call ftghsp(17,keysexist,keysadd,status)
do n=1,keysexist
call ftgrec(17,n,card,status)
if (card(1:9)=='CRVAL1 =') then
read(card,'(a9,e21.14)')alibi,a
endif
if (card(1:6)=='NAXIS1') then
read(card,'(a9,i21)')alibi,
endif
if (card(1:6)=='Z ') then
read(card,'(a9,e21.14)')alibi,redshift
endif
if (card(1:6)=='SN_G ') then
read(card,'(a9,e21.14)')alibi,sng
endif
enddo
l(1)=10.**a/(1.+redshift)
l(naxes)=10.**(a+0.0001*float(naxes-1))/(1.+redshift)
do n=1,naxes
l(n)=10.**(a+0.0001*float(n-1))
enddo
call ftthdu(17,hdnum,status)
call ftgidt(17,bitpix,status)
call ftgtcl(17,1,datacode,repeat,width,status)
call ftgpve(17,1,1,naxes,0.,fa,anynull,status)
call ftgpve(17,1,naxes+1,naxes,0.,fcs,anynull,status)
call ftgpve(17,1,2*naxes+1,naxes,0.,noiz,anynull,status)
call ftgpve(17,1,3*naxes+1,naxes,0.,mask,anynull,status)
call ftclos(17,status)
write(6,*)'spectra read in',l(1),l(naxes)
arq='spec-1.txt'
open (29,file=arq,status='unknown')
write(29,*) ' l(n)',' fa(n)'
do n=1,naxes
write(29,*) l(n), fa(n)
end do
close(25)
write(6,*)
write(6,'(a)')'Justice is done'
end
Eigentlich ist der Fehler passiert, da gibt es naxes immer einen null Wert!
- Bitte Schränken Sie es ein wenig runter! Sie können beginnen, durch den code zu kompilieren mit debug-Optionen (
-g
) und es läuft durchgdb
. Dies sollte Ihnen (und uns) wertvolle Hinweise 😉 - Konsultieren Sie software.intel.com/en-us/articles/... Berichten über die Ergebnisse Ihrer Untersuchungen.
- Wenn Sie nicht wissen, wie verwenden Sie gdb, installieren ddd. Wenn Sie gebaut haben, Ihren code mit -g, wenn Sie das laden der ausführbaren Datei, die Sie sehen sollten, alle der Quelle.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den häufigsten Ursachen für tödliche Speicher-Fehler in Fortran sind illegal, array-Indizes und Inkonsistenz zwischen den Argumenten für den Aufruf einer Prozedur (Unterprogramm oder Funktion) und was der deklarierten Argumente der Prozedur. Für den ersten, wiederum auf run-time-index überprüfen. Mit gfortran,
-fcheck=bounds
oder besser, schalten Sie zusätzliche Laufzeit-checks mit-fcheck=all
. Für die Prozedur-argument, Problem, legen Sie alle Ihre Prozeduren in Modul(en) unduse
diese module(s) aus jedem routine, ruft eines der Verfahren. Damit kann der compiler überprüfen argument Konsistenz zur compile-Zeit.real*8 l(0:10000)
.status
von jedem fitsio-routine aufrufen. Überprüfen Sie alle Ausgabe zu sehen, dass es Sinn macht. Finden Sie die früheste problem und beheben, nicht das erste problem, das Sie bemerken. Verwenden Sie das interaktive toolfv
um herauszufinden, was Sie erwarten sollten.Danke an Euch alle! Ich hinzufügen -fcheck=alle sehen, was falsch ist, wenn es versucht, das Programm auszuführen, und ich bekam das:
In Zeile 65 der Datei Codigo.f90
Fortran runtime error: Index '0' die dimension 1 des array 'l' unter die untere Grenze von 1
Eigentlich denke ich, dass das problem mit dem "naxes"! Denn wenn ich es kompilieren ersetzen "naxes", "2", zum Beispiel, ist es nicht geben Sie mir die Ergebnisse (natürlich), aber der Fehler geht Weg!
Tut, kann jemand vielleicht mir sagen, warum ist dieser Fehler mit "naxes" passiert?? Danke Euch allen nochmal!!!
naxes
Wert. Es erscheint regelmäßig auf den RS von Zuordnungen, ist es Häufig verwendet, um index in arrays, nirgendwo ist es Wert. Ehrlich gesagt, Sie sind glücklich, dass es festgelegt wird, um0
eher als einige andere Wert.