Можно ли объявить многосимвольную константу в Fortran без указания длины?

На вводном курсе по программированию мне сказали, что символьная константа в Fortran95 может быть объявлена ​​без указания длины, например:

character, parameter :: STR = 'Hello World!'

То же утверждение можно найти в книге Стивена Дж. Чепмена «Fortran 95/2003 для ученых и инженеров» (стр. 34), где говорится

Если именованная константа имеет тип CHARACTER, то нет необходимости объявлять длину строки символов. Поскольку именованная константа определяется в той же строке, что и объявление ее типа, компилятор Фортрана может напрямую подсчитывать количество символов в строке. Например, следующие операторы объявляют именованную константу error_message строкой из 14 символов «Неизвестная ошибка!».

CHARACTER, PARAMETER :: ERROR_MESSAGE = 'Unknown error!'

Я знаю, что можно использовать (len=*). Но действительно ли можно полностью исключить селектор длины?

Когда я тестировал его с помощью компиляторов GFortran и Intel, значение всегда усекалось до первого символа. Есть ли другой компилятор, который поддерживает это? Или кто-нибудь может указать мне на часть стандарта Fortran, которая разъясняет это?


person Sunfoil    schedule 04.05.2015    source источник


Ответы (2)


Согласно Стандарту Fortran 2008, character имеет длину из одного, если длина не указана. Это дано в кл. 4.4.3.2 «Спецификатор типа символа»:

4 [...] Если длина не указана в char-selector или * char-length, длина равна 1.

Это не зависит от того, является ли это символьной переменной или именованной константой. Это действительно происходит в вашем коде.

Та же строка присутствует в Fortran 95. Стандарт и в Стандарт Fortran 90, кл. . 5.1.1.5 в обоих документах.

Я предполагаю, что Чепмен берет свою информацию из FORTRAN 77 Standard, Cl . 4.8.1 Символьная константа, хотя этот пункт не относится к именованным константам:

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

Кроме того, я не смог найти никаких ссылок ни в одной документации стандарта или компилятора, подтверждающих утверждение Чепмена.

person Alexander Vogt    schedule 04.05.2015

Стандарт Fortran 2008 (я имею в виду последний свободно доступный проект перед официальным стандартом) говорит в разделе 4.4.3.2, параграф 4 (выделено мной):

Селектор символов в спецификации встроенного типа CHARACTER и длина символа * в описании объекта или в описании компонента определения типа определяют длину символа. Параметр * char-length в entity-decl или component-decl указывает индивидуальную длину и переопределяет длину, указанную в char-selector, если таковая имеется. Если * char-length не указан в entity-decl или component-decl , селектор длины или значение параметра типа, указанное в char-селекторе, является длиной символа. Если длина не указана в char-selector или * char-length, длина равна 1.

Это говорит о том, что если вы не укажете длину через *len или (LEN=len), тогда длина символа будет 1. Стандарт не делает никаких исключений (которые я могу найти) для типов символов с атрибутом параметра (5.3.13).

Возможно, у автора был компилятор, реализующий его требование как расширение поставщика, но я не могу найти для него основания в стандарте. Я тестировал gfortran 5.1.0, ifort 14.0.1 и pgf90 11.9, и все они соответствуют стандарту.

person casey    schedule 04.05.2015