Нарушены правила соответствия Фортрана - PullRequest
0 голосов
/ 28 апреля 2020

Чего я пытаюсь достичь

Я пытаюсь написать подпрограмму, которая принимает матрицу (двумерный массив) в качестве входных данных и красиво печатает ее на стандартный вывод консоли.

Проблема

error #6634: The shape matching rules of actual arguments and dummy arguments have been violated.   ['U']

Код

Подпрограмма, печатающая матрицу, находится в этом модуле

Модуль

    MODULE LinearSystems
    IMPLICIT NONE
    private
    ...
    public showMatrix
    ...
    contains
    subroutine showMatrix(a, n, m, name)
    implicit none
    double precision, dimension(:,:), intent(in) :: a
    character, dimension(:), intent(in), optional :: name
    integer, intent(in) :: n,m
    integer :: i, j
    write(*,*) "*** Show Matrix ", name, " ***"
    do i = 1, n
        do j = 1, m
            write(*,'(F8.4)',advance="no") a(i,j)
        end do
        write(*,*)
    end do
    end subroutine showMatrix

, и основная программа вызывает его

Основная программа

program PoisonEquation
    ...
    use LinearSystems
    implicit none
    double precision, dimension(:,:), allocatable :: u,...
    integer :: n = 700
    allocate(u(n-1,n-1))
    ...
    call showMatrix(u, n-1,n-1, "U")

Я с нетерпением жду получения советов о том, как улучшить этот код и избавиться от него.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Пустой аргумент name - это предполагаемый массив фигур (см. Объявление dimension(:)). Буква «U», используемая для фактического аргумента, является скалярной (сообщение об ошибке ссылается на этот литерал).

Если фиктивный аргумент является предполагаемым массивом формы, ранг фактического аргумента должен совпадать с рангом фиктивного аргумента (F2018 15.5.2.4p16).

Выяснить, является ли Вы хотите передать / получить массив или скаляр и исправить код.

0 голосов
/ 28 апреля 2020

Проблема решена

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

subroutine showMatrix(a, name)
    implicit none
    double precision, dimension(:,:), intent(in) :: a
    character(*), intent(in), optional :: name
    integer :: i, j
    write(*,*) "*** Show Matrix ", name, " ***"
    do i = 1, size(a,1)
        do j = 1, size(a,2)
            write(*,'(F8.4)',advance="no") a(i,j)
        end do
        write(*,*)
    end do
end subroutine showMatrix
...