2016-06-07 1 views
0

Предположим, что у меня есть матрица c (i, j). Я хочу записать его на экране на старом языке Fortran77 с тремя знаками после запятой. Я пишуКак написать отформатированную матрицу в строках с fortran77?

  do i=1,N 
     write(*,"(F8.3)") (c(i,j), j=1,N) 
     end do 

но вывод в виде

с (1,1)

с (1,2)

...

C (1 , 10) c (2,1)

c (2,2)

...

Наконец, я могу просто написать

  do i=1,N 
     write(*,*) (c(i,j), j=1,N) 
     end do 

, а затем выход, как матрица, но, конечно, она не отформатирована.

Как получить правильный результат в Fortran77?

Редактирование. Кажется, что один из решений заключается в написании

do i=1, N 
    do j=1, N 
    write(*,'(F9.3,A,$)') c(i,j), ' ' 
    end do 
    write(*,*) ' ' 
    end do 
+1

«$' вы добавили здесь технически нестандартный, я верю и могу быть заменен на 'advance = 'no'' в более современном fortran (например,' write (*,' (F9.3, A) ', advance = 'no') c (i, j), "" '). –

+1

Обратите внимание, что ваше решение НЕ является Fortran 77. Вопрос в том, почему вы просите Fortran 77? Вы должны копать глубоко, чтобы найти F77 только компиляторы все еще вокруг. Ваши фрагменты кода, безусловно, не F77, поэтому не совсем понятно, о чем вы просите. – haraldkl

+0

@haraldkl: это не так, поскольку я просто запускал его с помощью компилятора mpif77. –

ответ

2

Ваш формат определяет только один поплавок, но вы на самом деле хотите написать N в каждой строке.

Довольно общее решение для этого простого случая было бы что-то вроде

program temp 
    implicit none 
    integer, parameter :: N=3 
    real, dimension(N,N) :: c 
    integer :: i,j 
    character(len=20) :: exFmt 
    c = 1.0 
    write(exFmt,'("(",I0,"(F8.3))")') N 
    do i=1,N 
    write(*,exFmt) (c(i,j), j=1,N) 
    end do 
    end program 

Это сделает exFmt быть '(3(F8.3))', который определяет печать три поплавков (обратите внимание, вы, вероятно, действительно хочет '(3(F8.3," "))' явно включать некоторый интервал).

Примечание. Некоторые компиляторы позволят exFmt быть только '(*(F8.3))'. Это часть спецификации fortran 2008, поэтому она не может быть предоставлена ​​всеми компиляторами, к которым у вас есть доступ. См here для резюме поддержки компилятора (см Безлимитный пункт формат, благодаря HighPerformanceMark для этого)

Наконец простой латать является использование формата Постулаты как '(1000(F8.3))' где 1000 больше, чем вы когда-нибудь понадобится.

 Смежные вопросы

  • Нет связанных вопросов^_^