Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是;数组不能具有延迟形状“0”;用fortran是什么意思?_Fortran_Gfortran_Fortran2003 - Fatal编程技术网

什么是;数组不能具有延迟形状“0”;用fortran是什么意思?

什么是;数组不能具有延迟形状“0”;用fortran是什么意思?,fortran,gfortran,fortran2003,Fortran,Gfortran,Fortran2003,我有一个简单的fortran函数,用于计算Kronecker产品: function kron(A, B) implicit none real, intent(in) :: A(:, :), B(:, :) integer :: i, j, ma, na, mb, nb real, dimension(:, :) :: kron ma = ubound(A, 1) na = ubound(A, 2) mb = ubound(b, 1)

我有一个简单的fortran函数,用于计算Kronecker产品:

function kron(A, B)
    implicit none
    real, intent(in) :: A(:, :), B(:, :)
    integer :: i, j, ma, na, mb, nb
    real, dimension(:, :) :: kron

    ma = ubound(A, 1)
    na = ubound(A, 2)
    mb = ubound(b, 1)
    nb = ubound(b, 2)
    forall(i=1:ma, j=1:na)
        kron(mb*(i-1)+1:mb*i, nb*(j-1)+1:nb*j) = A(i,j)*B
    end forall
end function kron
它在一个模块内,但是当我使用
gfortran-static-ffree form-std=f2003-Wall
编译它时,我得到以下错误:

function kron(A, B)
                1
Error: Array 'kron' at (1) cannot have a deferred shape

发生此错误是因为您应该事先知道要返回的数组的大小吗?

这正是错误告诉您的:
kron
必须具有明确的形状。如果不想事先传递数组大小,则必须将
kron
定义为

real, dimension(lbound(a,dim=1):ubound(a,dim=1),&
                lbound(a,dim=2):ubound(a,dim=2)) :: kron

在gfortran 4.6.3上使用上述特定的显式声明确实可以为我编译。

具有可分配属性的延迟形状数组称为可分配数组。当通过ALLOCATE语句为其分配存储时,将确定其边界和形状

试试这个


real、intent(in)、allocatable、dimension(:,::A(:,:)、B(:,:)

您只需要将可分配数组定义为可分配数组,即将kron定义替换为

real, allocatable, dimension(:,:) :: kron
这也适用于4.6.3,定义如下:


希望这能为您节省一些精力,特别是考虑到这里不需要定义下限!

谢谢。我想没有办法不为每个维度调用
lbound
两次,对吧?因为我在分配
ma
和其他变量时再次调用它。我也更正了问题中的拼写错误,既然
A(i*j)*B
应该是
A(i,j)*B
@user2766558实际上,再看一遍,数组
kron
的维度应该是
(a1*b1,a2*b2)
,其中
a1=ubound(A,dim=1)-lbound(A,dim=1)+1
和其他类似。奇怪。运行您给我的代码确实有效,但可能只是为了我的简单示例。不会
a1=size(a,1)
a2=size(a,2)
也能工作吗?如果我做了更改,代码会正确编译/运行。比如说。是的,
size
可以工作。但是,请注意,如果
a
b
的起始索引小于1,那么在定义
kron
时就会有一个小问题,我甚至不知道这是可能的。我认为所有数组s在Fortran中是1索引的,但我想这对于与C的兼容性是有意义的,对吗?我只是将此代码用于个人用途,可能不会重新定义开始索引。除非我遗漏了其他内容,否则我将接受您的答案。这不能作为(a.o.)方括号的数量不匹配。这与函数kron的返回变量/名称有何关系?否!或者不仅仅如此。您不能仅使其可分配。以后使用它的方式将是非法使用未分配的数组。