Как печатать переменные с помощью высокоточного фортрана FMZM

Я хотел бы использовать возможности пакета 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 делает то же самое.


person Tommy R. Jensen    schedule 24.05.2021    source источник
comment
Что такое тип im? Как человек, не знакомый с FMZM, у меня нет оснований ожидать, что поведение программы будет идентично тому, где n объявлено целым числом.   -  person francescalus    schedule 24.05.2021
comment
Поддерживает ли FMZM ввод/вывод определяемых пользователем производных типов? Или что он должен печатать?   -  person Vladimir F    schedule 24.05.2021
comment
См. пример кода по адресу stackoverflow.com/questions/38801846/ Вы увидите, что сначала нужно получить строку, используя IM_format( 'i200', n ), и напечатать эту строку.   -  person Vladimir F    schedule 24.05.2021
comment
Поскольку IM является производным типом, неясно, что делают =, <, write. n=0 может или не может установить компонент n в 0, а write(*,*) n может или не может печатать компонент n. Вполне вероятно, что если IM имеет компонент, то это просто ссылка на другую структуру данных (которая является произвольной арифметической частью). Если тип не имеет пользовательского вывода, этот компонент, который печатается, действительно является ссылкой на память. (Это просто означает, что из предоставленных вами подробностей невозможно ответить на вопрос без хорошего знания конкретного пакета.)   -  person francescalus    schedule 24.05.2021
comment
@Vladimir Спасибо, кажется, это помогает!   -  person Tommy R. Jensen    schedule 24.05.2021


Ответы (1)


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

str = im_format('i100', n)
str = adjustl(str)
str = trim(str)
print*, str

где две средние строки можно опустить.

person Tommy R. Jensen    schedule 24.05.2021