Путаница с размерами массива символов в Fortran 77

У меня есть следующий фрагмент кода в моей подпрограмме:

character    x*256 ,y*80
common /foo/ x     ,y(999)

Ну я собственно не это писал. Так что я не понимаю размеры здесь. Является ли y широким массивом из 999 элементов из 80-символьных строк?

Если да, то как я могу правильно определить это в Fortran 90 без общего блока?


person osolmaz    schedule 21.05.2014    source источник
comment
Вы спрашиваете, как объявить массив символов, или после более глубокого понимания фрагмента кода? Если второе, то краткий ответ: вы правы.   -  person francescalus    schedule 22.05.2014
comment
Возможно, более глубокое понимание массивов символов. Потому что из C я привык к тому, что строка представляет собой массив символов, и у меня есть указатель. Что именно здесь происходит. Что произойдет, если я скажу x(10) или y(10)?   -  person osolmaz    schedule 22.05.2014


Ответы (1)


Сначала я скажу, что код, который у вас есть, является «правильным» Fortran 90, но я согласен с желанием отойти от общих блоков.

По сути, нет ничего особенного в символьной природе объявления. Всякий раз, когда

<type> A
common /foo/ A(<size>)

используется две части объявления A, а также общая ассоциация: тип и размерность. Игнорируя ассоциацию, объявление измерения в операторе common разрешено, и приведенное выше похоже на

<type> A
dimension A(<size>)

Это, в свою очередь, то же самое, что и

<type>, dimension(<size>) :: A

Что касается конкретного примера, тип представляет собой символ длиной 80. Ваше нестандартное объявление будет просто

character(len=80), dimension(999) :: y

Действительно, тогда y представляет собой массив ранга 1 размером 999 и длиной 80 символов. y(10) — это скалярная длина 80 символов (10-й элемент массива y).

x(10) — неправильный синтаксис, так как (10) — индексация массива, а x — скаляр. Для подстрок требуется другая индексация. x(10:10) — 10-й символ символьной переменной x; y(10)(10:10) — это 10-й символ 10-го элемента массива символов y.

person francescalus    schedule 21.05.2014