#fortran #character #fortran-common-block
#массивы #fortran
Вопрос:
возможно ли назначить размер и значения общего массива в подпрограмме, а затем использовать его из других подпрограмм программы?
Следующая программа не работает, но я хочу сделать что-то вроде этого:
main.f
program main
integer n
integer, allocatable :: co(:)
common n, co
call assign
print *, co(1), co(2)
deallocate(co)
stop
end program main
назначить.f
subroutine assign
integer n
integer, allocatable :: co(:)
common n, co
n = 2
allocate(co(n))
co(1) = 1
co(2) = 2
return
end subroutine assign
Комментарии:
1. Лучше забыть такие вещи, как
common
,block data
иequivalence
. По крайней мере, для начинающих.
Ответ №1:
Нет. Вы можете помещать указатели в общие, но не в выделяемые объекты.
Причина в том, что фундаментальной концепцией для common является ассоциация хранилища, где вы можете создать непрерывную последовательность всех элементов, которые находятся в common, и эти последовательности затем распределяются между областями. Размер распределяемых объектов может динамически меняться в области видимости, что затруднило бы отслеживание последовательности элементов в общем блоке, который следовал за распределяемым.
(Типичная реализация распределяемых объектов означает, что хранилище, непосредственно связанное с выделяемым объектом, является просто дескриптором — фактические данные хранятся в другом месте. Это практически нарушает концепцию непрерывной последовательности единиц хранения, учитывая, что статус выделения (как записано в дескрипторе) и данные являются частью значения выделяемого. Реализация для указателей аналогична, но тогда концептуально данные, находящиеся в другом месте памяти, не являются частью значения указателя, поэтому не следует ожидать, что они появятся в непрерывной последовательности, которую описывает common — указатель находится в последовательности, но не на то, на что он указывает.)
Для распределяемых файлов требуется F90. Это означает, что вы можете использовать переменные модуля, которые являются гораздо лучшим решением, чем использование общих для глобальных данных. Если вы должны сделать это с помощью common, то используйте указатель данных.