Проблема при чтении файла Фортрана с IDE CodeBlocks - PullRequest
0 голосов
/ 02 октября 2018

Недавно я начал изучать язык программирования Фортран.Я использую CodeBlocks IDE с компилятором GNU Fortran.

У меня проблема с простым кодом, который я нашел в онлайн-курсе Fortran, который объясняет, как читать и писать из файла.

Программаимеет следующий вид:

program main
implicit none

character (len=14) :: c1,c2,c3
integer :: n
real :: T

open(unit=10,file='titi.txt')
read(10,*) c1,n,c2
read(10,*) c3,T
close(10)


open(unit=20,file='toto.txt')
write(20,*) c1,'il est',n,c2
write(20,*)'la',c3,'est de',T,'degres'
close(20)

end

Если файл 'titi.txt' содержит:

bonjour 4   heures
temperature 37.2

Сообщение об ошибке, отображаемое в консоли, выглядит следующим образом:

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

 Backtrace for this error:
 #0  ffffffff

Я попытался использовать флаг

  -g

И чем с помощью отладчика я обнаружил, что проблема в первой строке, где использовалось «чтение»

  read(10,*) c1,n,c2

Я действительно не понимаюне знаю, как с этим бороться.Код кажется мне довольно простым, и я никогда не видел это сообщение об ошибке раньше, поэтому я не знаю, что это значит.

Спасибо за ваши ответы заранее.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Спасибо всем за ваши ответы.На самом деле, что вызвало проблему в том, что я использовал старый компилятор.Поэтому, когда я скачал последнюю версию, все работало идеально, без каких-либо изменений в коде.

0 голосов
/ 03 октября 2018

Это не ответ, но слишком много текста для комментария.

На моем компьютере все работает нормально.

Можете ли вы скомпилировать его с

gfortran -g -O0 -fbacktrace -Wall -fcheck=all

Таким образом, вы должны получить гораздо больше информации.Кроме того, вы можете добавить некоторые проверки ошибок:

Добавить следующие переменные:

integer :: ios
character(len=100) :: iomsg

Затем вы можете добавить проверку ошибок ко всем операторам io, например так:

read(10,*) c1,n,c2

становится:

read(10,*,iostat=ios,iomsg=iomsg) c1,n,c2
if (ios /= 0) then
    print*, "Error reading c1, n, c2:"
    print*, trim(iomsg)
    STOP
end if

Это также может дать вам некоторые подсказки.

...