Отображение строки произвольной длины с использованием IM_FORM в библиотеке множественной точности Fortran FMZM - PullRequest
0 голосов
/ 19 ноября 2018

Я смотрю документацию для FMZM здесь , а из раздела 8. (c) я понимаю, что:

(c) Subroutine FM_FORM does similar formatting, but we supply a character string for
    the formatted result.  After declaring the strings at the top of the routine, as with
          CHARACTER(80) :: ST1,ST2
    the WRITE above could become
          CALL FM_FORM('F15.6',H,ST1)
          CALL FM_FORM('E15.7',T,ST2)
          WRITE (*,"(' Step size = ',A,'  tolerance = ',A)") TRIM(ST1),TRIM(ST2)
    FM_FORM must be used instead of FM_FORMAT when there are more than 200 characters
    in the formatted string.  These longer numbers usually need to be broken into several
    lines.

Мне нужно использовать IM_FORMфункция для отображения больших целых чисел длиннее 200 символов.В моем случае, заменяя IM_FORM на FM_FORM выше.

Следуя этому примеру , я вижу объявление для:

character(200) :: str

и некоторое умное форматирование:

str = IM_format( 'i200', result )   !<----- convert BigInt to string
print *, n, trim( adjustl(str) )    !<----- print huge integers

Это здорово, когда я знаю, что мой вывод менее 200 символов.Однако, поскольку я работаю с библиотекой произвольной точности, есть хорошие шансы, что у меня могут быть цифры значительно больше.

Так что рабочая форма примерно такая:

   character(2000)       :: str   
   res = mygetlargenumberfunction(n)
   call im_form('i2000', res, str)

Как мне объявитьПеременная character(?) :: str и мой формат IM_FORM, чтобы я мог разместить потенциально значительно больший вывод, неизвестный во время компиляции?Мне просто нужно угадать очень большое число?

Обновить адресацию комментариев

Я обращаюсь как к распределению, так и к строке формата в контексте библиотеки произвольной точности FMZM, какэто не связано с вопросом, который помечен как дубликат.

Изменение

   character(2000)       :: str

на

   character (len=:), allocatable :: str

при прочих равных дает

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
...
Segmentation fault (core dumped)

Так что это предложение кажется несовместимым с FMZM.

Использование gfortran -std=f2008 myprogram.F90 и

GNU Fortran (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0

1 Ответ

0 голосов
/ 19 ноября 2018

С подталкивания @ francescalus я решил проблему следующим образом:

   ! 
   character (len=:), allocatable :: str
   character(len=1024) :: fmat
   !
   res = mygetlargenumberfunction(n)      ! call the function
   lenr = log10(TO_FM(res))+1             ! size the string
   allocate(character(len=lenr) :: str)   ! now allocate the string itself
   write (fmat, "(A5,I0)") "i", lenr      ! create the format string
   call im_form(fmat, res, str)           ! do the call
   print*, trim( adjustl(str))
...