пытается записать строку в подпрограмму, вызывая ошибку - PullRequest
0 голосов
/ 02 февраля 2019

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

  PROGRAM test
  IMPLICIT NONE
  INTEGER a
  CHARACTER*20 STR,str1
  STR = 'Hello world'
  a = 1     
  WRITE (*,*) a  
  WRITE (*,10) STR    
  CALL TEST(str1)
  STOP
  END

  SUBROUTINE test(str2)
  CHARACTER*20 str2
  str2 = 'testing'
  WRITE (*,10) STR2
  RETURN
  END

При попытке скомпилировать этот код возвращается сообщение «Ошибка: отсутствует оператор номер 10»

Кроме того, у меня есть еще несколько вопросов:

  1. Что означает *20 в CHARACTER*20 STR?Это размер строки?

  2. Как насчет 10 в WRITE (*,10) STR?Это длина строки для записи?

  3. что означает (*,*) в WRITE (*,*) a

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

* 20 после CHARACTER указывает размер переменной CHARACTER (в данном случае 20 символов).FORTRAN не использует строки с нулевым символом в конце, как другие языки, вместо этого вы должны зарезервировать определенное количество символов.Фактическая строка может быть короче переменной, но никогда не длиннее.

Запятая (,) в операторе write используется для разделения различных аргументов.Некоторые версии FORTRAN позволяют вам указывать «именованные» аргументы, но по умолчанию первым аргументом является код файла, в который записывается («*» подразумевает стандартный вывод).Вторым аргументом будет номер строки оператора FORMAT.Может быть больше аргументов, вам нужно поискать специфику оператора OPEN в вашей версии FORTRAN.

Некоторые из ваших операторов WRITE () указывают на использование оператора FORMAT, найденного в lable '10».Но ваш пример не предоставляет никакого оператора FORMAT, так что это будет ошибкой.

Если вы не хотите иметь дело с оператором FORMAT, вы можете использовать звездочку (*) в качестве второго аргумента, а затем FORTRAN будет использовать общий формат по умолчанию.Это то, что делает ваш первый WRITE (, ).Он записывает в стандартный вывод в обычном формате.

0 голосов
/ 02 февраля 2019

Как вы можете прочитать, например, здесь: https://www.obliquity.com/computer/fortran/io.html

второе значение, данное для записи, является аргументом для неявного ключевого слова формата, которое является меткой оператора в том же программном блоке, символавыражение или массив, содержащий полную спецификацию формата, или звездочку * для форматирования по списку.

Таким образом, если вы предоставляете данные напрямую, вы можете вместо этого использовать * там.В противном случае ваша программа должна иметь метку 10 в некоторой строке с оператором форматирования.

И да, CHARACTER * 20 STR означает, что переменная STR имеет длину 20, как вы можете прочитать, например, здесь: https://www.obliquity.com/computer/fortran/datatype.html

...