首页 > 解决方案 > 违反 Fortran 形状匹配规则

问题描述

我想达到什么目的

我试图编写一个以矩阵(2D 数组)作为输入的子例程,并将其很好地打印到标准控制台输出。

问题

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")

我期待收到有关如何改进此代码并使其无错误的提示。

标签: arraysmoduleinterfacefortranshapes

解决方案


name dummy 参数是一个假定的形状数组(参见dimension(:)声明)。用于实际参数的“U”字面量是标量(错误消息指的是这个字面量)。

如果虚拟参数是假定形状数组,则实际参数的等级应与虚拟参数的等级相同(F2018 15.5.2.4p16)。

弄清楚您是要传递/接收数组还是标量,然后修复代码。


推荐阅读