Ошибка gfortran: требуется неотрицательная ширина в строке формата в (1)

Код, о котором идет речь, таков:

  subroutine PG_TLab_Write(c30,r,d)
  implicit none
  character*30 c30,leftjust
  real*4 r
  integer*4 d,k
  if (d.eq.0) then
    write(c30,'(i30)') nint(r)
  elseif (d.gt.0) then
    write(c30,'(f30.<d>)') r
  else
    k = abs(d)
    write(c30,'(1pe30.<k>') r
  endif
  c30 = leftjust(c30)
  if (d.lt.0) then
    k = index(c30,'E')
    c30 = c30(1:k-1)//'x10\\u'//c30(k+1:24)
  endif
  return
  end

Это действительно старый (плохой) код, и я не программист на фортране. Ошибка, которую он выдает, следующая:

Error: Nonnegative width required in format string at (1) pg-util.f:561.26:

Это дает ошибки на последних двух операторах записи в сегменте.

Мой вопрос: как мне сделать d и k целыми числами без знака, чтобы он скомпилировался?


person Samuel Leathers    schedule 16.03.2011    source источник


Ответы (1)


Вы не можете сделать d и k беззнаковыми, поскольку Фортран не имеет целых чисел без знака.

Я предполагаю, что если предположить, что строка 561 в сообщении об ошибке относится к предпоследней строке в опубликованном вами фрагменте, проблема заключается в выражении формата переменной (вещь ‹k›). Выражения формата переменных — это расширение стандарта, которое не поддерживается gfortran. См. раздел о выражениях формата переменных в руководстве по gfortran. пример того, как сделать эквивалентную вещь стандартным образом.

person janneb    schedule 16.03.2011
comment
Я удалил строку ‹k› и жестко запрограммировал ‹d› на 30. Это позволило ему скомпилироваться. Посмотрим, будут ли какие-либо неблагоприятные последствия от этого. - person Samuel Leathers; 16.03.2011