Почему мой код не компилируется на fortran?

#compiler-errors #fortran

#ошибки компилятора #fortran

Вопрос:

Это мой код, и он не компилируется, вывод только такой:

 1>Error: The operation could not be completed 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
 

Я использую Microsoft Visual studio 2019 и intel parallel studio 2020 для fortran.

 program Truss
 implicit none
 integer :: Nnodes
 open(unit=1,file='data.txt')
 open(unit=2,file='output.txt')
 read(1,2) Nnodes
 write(2,3) Nnodes
 2  format(7x)
 3  format("Number of nodes:",1I)


end program Truss
 

Файл data.txt содержит эти:

 npoint 3
0 0
2 0
1 1
 

Я хочу прочитать ‘3’ после npoint, поэтому я игнорирую 7 символов.

Комментарии:

1. Stackover не примет мою правку для правильного форматирования вашего кода. Ну и ладно! Пара вещей. 1. Не используйте unit=1 или 2 для ввода-вывода, некоторые компиляторы используют их в качестве предварительно подключенных номеров единиц. 2. Ваши инструкции format, вероятно, неверны. Используйте ввод-вывод в направлении списка. То есть используйте read(1,*) и write(2,*) .

Ответ №1:

Это всего лишь предположение, но, похоже 7x , в вашем случае за ним должна следовать спецификация типа (например I1 ).

 program Truss

  implicit none
  integer :: Nnodes

  open (unit=10, file='data.txt')
  open (unit=20, file='output.txt')

  read (10, 2) Nnodes
  write(20, 3) Nnodes

2 format(7X,I1)
3 format("Number of nodes: ", I1)

end program Truss
 

Но, как я уже сказал, это просто чистое предположение, чего вы пытаетесь достичь.

Я предполагаю, что ваш входной файл выглядит следующим образом:

 > cat data.txt
       1
 

Ответ №2:

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

Тем не менее, вот три вещи, которые я заметил, и две из них были замечены @evets и @Oo.oO также:

  • Не используйте номера единиц меньше 10. Некоторые из них могут быть зарезервированы для стандартного ввода и вывода, или вывода ошибок, или тому подобного.
  • Вы пытаетесь прочитать целое число, но заданный вами формат не содержит никакого целочисленного дескриптора. 7X просто означает «игнорировать 7 символов», но игнорирование не считывает значения. Теперь я не знаю, как выглядит ваш входной файл или почему вы чувствуете необходимость игнорировать первые 7 символов. Как правило, лучше всего просто использовать
       read(unit, *) Nnodes
     

    но если вам нужно объявить формат, то этот спецификатор формата должен содержать некоторый компонент для фактического целого числа, например:

       2 FORMAT(7X, I4)  
     

    Предполагается, что символы с 8 по 11 в строке ввода не содержат ничего, кроме числа, и все. 4 После I обозначает, сколько символов содержит число, которое нужно прочитать.

  • Наконец, есть формат для инструкции print . У вас есть 1I — Numbers перед I указанием количества целых чисел для чтения. 1 в этом случае это излишне. Но я достаточно уверен, что I после этого требуется число I , чтобы указать, сколько цифр следует использовать для целого числа.

    Теперь некоторые компиляторы, похоже, принимают I0 значение «столько, сколько вам нужно», но я не знаю, какой это стандарт и принимает ли его ваш компилятор. Некоторые компиляторы могут также принимать только I , но я не думаю, что это соответствует стандарту. (Я уверен, что кто-нибудь поправит меня там в комментариях под этим ответом ;))

Приветствия

Ответ №3:

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

 program Truss
implicit none
integer :: Nnodes
open(unit=11,file='data.txt')
open(unit=22,file='output.txt')
read(11,20) Nnodes
write(22,30) Nnodes
20  format(7x,I3)
30  format("Number of nodes:",2I)


end program Truss
 

Теперь я хочу, чтобы 2 строки игнорировались и записывались данные output.txt в соответствии с форматом 30, но вот как это происходит:

 Number of nodes:           3