Предполагаемые массивы размера: Colon vs. asterisk - DIMENSION (:) arr vs. arr (*)

Есть ли разница между этими двумя методами объявления массива предполагаемого размера?

например.

real, dimension(:) :: arr

и

real               :: arr(*)

Ответ 1

Форма

real, dimension(:) :: arr

объявляет массив предполагаемой формы, а форма

real :: arr(*)

объявляет массив предполагаемого размера.

И, да, между их использованием существуют различия. Различия возникают из-за того, что, примерно, компилятор "знает" форму массива предполагаемой формы, но не массива предполагаемого размера. Дополнительная информация, доступная компилятору, означает, что, помимо прочего, массивы предполагаемых форм могут использоваться в выражениях всего массива. Массив предполагаемого размера может использоваться только в выражениях целого массива, когда он является фактическим аргументом в ссылке на процедуру, которая не требует формы массива. О, а также в вызове внутреннего lbound, но не в вызове внутреннего ubound. Существуют и другие тонкие, и не очень тонкие различия, которые обнаруживают ваше близкое чтение стандарта или хорошей книги Фортрана.

Некоторые советы для новых программистов Fortran - использовать массивы предполагаемой формы, когда это возможно. Они не были доступны до Fortran 90, поэтому вы увидите множество массивов предполагаемого размера в старом коде. Массивы с предполагаемой формой лучше в новом коде, потому что функции shape и size могут использоваться для запроса их размеров, чтобы избежать ошибок вне границ и до allocate массивов, размеры которых зависят от размеров входных массивов.

Ответ 2

Ответ на высокопроизводительный знак объясняет разницу между двумя утверждениями - одним словом: да, есть разница; только один объявляет массив предполагаемого размера - и последствия.

Однако, как dimension(:), но упоминается, казалось бы, против не dimension(*), я добавлю одно.

real, dimension(:) :: arr1
real, dimension(*) :: arr2

эквивалентно

real :: arr1(:)
real :: arr2(*)

или даже с помощью операторов dimension. [Я не хочу этого поощрять, поэтому я не буду выписывать пример.]

Важное различие в вопросе заключается в использовании * и :, а не dimension.

Возможно, было какое-то слияние предполагаемого размера с фиктивным аргументом? Это как фиктивный аргумент, где этот выбор наиболее распространен.