Я хотел бы использовать возможности пакета FM для изучения задачи по теории чисел. Я установил пакет, скомпилировал библиотеки и запустил два прилагаемых набора тестов — все без проблем.
Я написал test.f
:
use fmzm
TYPE (IM), SAVE :: n
n = 0
WRITE(*,*) n
end
и скомпилировано с использованием
gfortran -c -O3 -Wall test.f
gfortran fmsave.o fm.o fmzm90.o test.o -o test
который не вернул ни ошибки, ни предупреждения. Но разочаровался, обнаружив вывод:
./test
200000
Число 200000 кажется ячейкой памяти для переменной n. Я немного поэкспериментировал, и если я меняю на сложный type (ZM)
, он выводит 200000, 199999
. Точно так же, если я объявлю и инициализирую две переменные вместо одной.
Если я изменю TYPE (IM), SAVE :: n
на INTEGER n
и скомпилирую точно так же, как указано выше, я получу ожидаемый результат 0
.
Если я заменю код на
n = 0
do
n=n+1
if (n < 10) WRITE(*,*) n
end do
затем вывод 200000
повторяется 9 раз, а затем останавливается. Так что это функция WRITE
, которая находит только местоположение, а не значение. PRINT
делает то же самое.
im
? Как человек, не знакомый с FMZM, у меня нет оснований ожидать, что поведение программы будет идентично тому, гдеn
объявлено целым числом. - person francescalus   schedule 24.05.2021IM_format( 'i200', n )
, и напечатать эту строку. - person Vladimir F   schedule 24.05.2021IM
является производным типом, неясно, что делают=
,<
,write
.n=0
может или не может установить компонентn
в0
, аwrite(*,*) n
может или не может печатать компонентn
. Вполне вероятно, что еслиIM
имеет компонент, то это просто ссылка на другую структуру данных (которая является произвольной арифметической частью). Если тип не имеет пользовательского вывода, этот компонент, который печатается, действительно является ссылкой на память. (Это просто означает, что из предоставленных вами подробностей невозможно ответить на вопрос без хорошего знания конкретного пакета.) - person francescalus   schedule 24.05.2021