Удаление оператора записи вызывает сбой моей программы - PullRequest
0 голосов
/ 08 мая 2018

У меня есть немного странная проблема, возникающая в моем коде, и у меня никогда не было такой проблемы раньше. У меня есть программа, которая вычисляет два тела, движущихся по орбите под действием собственной силы тяжести и в цикле do, который я использую для вычисления их движения во времени, у меня есть оператор записи, который записывает данные в файл для последующего построения. Однако недавно я хотел удалить оператор записи, но когда я его удаляю, программа завершает работу после нескольких вычислений с заполнением данных NaN. Я добавлю несколько строк ниже.

 open(unit=100,file=datafile)  !open file with name datafile (#)

 do while(ctime<totaltime)     !loop until current time > total time 
   call calc_semimajor(Objects, a)     !calculate semimajor axis
   call calc_ecc(Objects, evector, e)  !calculate eccentricty 

   at = (a0**4 - (264.0d0/5.0d0)*beta_time*ctime)**0.25 
   write(100,*) ctime, Objects(1:2), a, at, e  !write to file (#)

   !some 
   !more 
   !lines
   !here... 

 end do

 close(100) !close datafile (#)

У меня этот цикл хранится в подпрограмме для справки, но это никогда не было проблемой с другими программами, которые я сделал. Я попытался изменить номер устройства, которое не сработало. Я перестал передавать символьный аргумент в файле данных и просто определил файл как «data.txt» в подпрограмме, которая не работала. Я попытался скопировать его как обычный текст и перекомпилировать с gfortran, но это не сработало. Я выполнил компиляцию с помощью nagfor, и это дало ошибку недостаточного заполнения и мне удалось вычислить еще несколько временных шагов перед сбоем, но эта ошибка исчезает, когда я удаляю комментарии для строк, включающих unit = 100 (помеченных (#)). Я даже пытался переписать программу enitre, чтобы увидеть, что я что-то упустил, но я продолжаю сталкиваться с этой проблемой, даже когда переписываю без операторов open (). У меня есть некоторые константы, хранящиеся в модуле, которые вводятся с подпрограммой, если это может быть проблемой? Извините, если это было сформулировано плохо, но мне было просто интересно, если у кого-нибудь когда-либо была эта проблема в Фортране, и если да, то как я мог ее решить?

Спасибо!

Редактировать: я использовал valgrind, чтобы помочь найти проблему. (Компиляция с флагом -g ранее) и это дало эту повторяющуюся ошибку

  `==14846== Conditional jump or move depends on uninitialised       value(s) 
   ==14846== by 0x40131B: leapfrog_ (/path/to/file)
   ==14846== by 0x40353C: MAIN__ (/path/to/file)
   ==14846== by 0x403939: main (/path/to/file)
   ==14846== Uninitialised value was created by a stack allocation 
   ==14846== at 0x401C12: calc_pnacceleration_ (/path/to/file)

Я добавил в интерфейс для подпрограмм и поместил фиктивные переменные в подпрограммах, а не использовал те же имена переменных из основного тела. Это не решило проблему. Тем не менее, одна вещь, которую я заметил, это то, что, если я соблюдаю флаг оптимизации (-O3), ошибка исчезает, и она выполняется в течение указанного времени. Может ли это указывать на какую-то конкретную ошибку?

Второе редактирование: я добавил вывод при компиляции с gfortran -Wall -g -fcheck=all -fbacktrace

Simulation: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: 
(.text+0x0): first defined here
Simulation: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o: 
(.fini+0x0): first defined here
Simulation:(.rodata+0x0): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: 
(.rodata.cst4+0x0): first defined here
Simulation: In function `data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: 
(.data+0x0): first defined here
Simulation: In function `data_start':
(.data+0x8): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o:(.data+0x0): first defined 
here 
Simulation: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o: 
(.init+0x0): first defined here
/tmp/ccDIKQQB.o: In function `calc_ecc_':
/path/to/file/Simulation.f90:441: multiple definition of `calc_ecc_'
Simulation:(.text+0xf6): first defined here
/tmp/ccDIKQQB.o: In function `crossproduct_':
/path/to/file/Simulation.f90:466: multiple definition of 
`crossproduct_'
Simulation:(.text+0x1624): first defined here
/tmp/ccDIKQQB.o: In function `leapfrog_':
/path/to/file/Simulation.f90:262: multiple definition of `leapfrog_'
Simulation:(.text+0x26d): first defined here
/tmp/ccDIKQQB.o: In function `calc_pnacceleration_':
/path/to/file/Simulation.f90:358: multiple definition of 
`calc_pnacceleration_'
Simulation:(.text+0xe57): first defined here
/tmp/ccDIKQQB.o: In function `calc_semimajor_':
/path/to/file/Simulation.f90:426: multiple definition of 
`calc_semimajor_'
 Simulation:(.text+0xd8b): first defined here
 /tmp/ccDIKQQB.o: In function `dotproduct_':
 /path/to/file/Simulation.f90:479: multiple definition of 
 `dotproduct_'
 Simulation:(.text+0x15c1): first defined here
 /tmp/ccDIKQQB.o: In function `calc_deltaphigr_':
 /path/to/file/Simulation.f90:415: multiple definition of 
 `calc_deltaphigr_'
 Simulation:(.text+0x16ed): first defined here
 /tmp/ccDIKQQB.o: In function `main':
 /path/to/file/Simulation.f90:25: multiple definition of `main'
 Simulation:(.text+0x2be5): first defined here
 /tmp/ccDIKQQB.o: In function `plotdata_':
 /path/to/file/Simulation.f90:231: multiple definition of 
 `plotdata_'
 Simulation:(.text+0x2c20): first defined here
 /tmp/ccDIKQQB.o: In function `writeline_':
 /path/to/file/Simulation.f90:490: multiple definition of `writeline_'
 Simulation:(.text+0x3418): first defined here
 /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o:(.tm_clone_table+0x0):  
 multiple definition of `__TMC_END__'
 Simulation:(.data+0x18): first defined here
 /usr/bin/ld: error in Simulation(.eh_frame); no .eh_frame_hdr table 
 will be created.
 collect2: error: ld returned 1 exit status

1 Ответ

0 голосов
/ 08 мая 2018

Скомпилируйте ваш код со следующими параметрами: -Wall -fcheck=all -g -O -finit-real=nan -ffpe-trap=invalid Исправьте все предупреждения. Когда вы запускаете код, используйте «y» и «1» в качестве ваших входов. Когда он умирает из-за использования неинициализированного переменные. Используйте gdb, чтобы посмотреть дамп ядра.

...