#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