自定义类型数组的类虚拟参数卡在 -fcheck=bounds 上

发布于 2025-01-13 20:31:39 字数 759 浏览 1 评论 0原文

我有以下简单的 Fortran 代码

program test

    type vec
        integer :: x(3)
    end type

    type(vec) :: v(2)

    call sub(v)

contains

    subroutine sub (v)

        class(vec), intent(in) :: v(:)

        integer :: k, q(3)

        q = [ (v(1)%x(k), k = 1, 3) ]   ! <-- fails here

   end subroutine

end program

,当由 GNU Fortran 11(但不是其他版本)使用 -fcheck=bounds 编译时,会失败并显示错误

At line 19 of file test.f90
Fortran runtime error: Index '3' of dimension 1 of array 'v%_data%x' above upper bound of 2

它看起来好像编译器只是交换了 < 的长度code>x 和 v 这可以通过更改数字来确认。

当单词 class 替换为 type 时,问题就消失了。

我相信该代码是有效的。或者是否违反了某些 Fortran 语言限制导致了这种令人惊讶的行为?

I have the following simple Fortran code

program test

    type vec
        integer :: x(3)
    end type

    type(vec) :: v(2)

    call sub(v)

contains

    subroutine sub (v)

        class(vec), intent(in) :: v(:)

        integer :: k, q(3)

        q = [ (v(1)%x(k), k = 1, 3) ]   ! <-- fails here

   end subroutine

end program

which, when compiled by GNU Fortran 11 (but not other versions) with -fcheck=bounds, fails with the error

At line 19 of file test.f90
Fortran runtime error: Index '3' of dimension 1 of array 'v%_data%x' above upper bound of 2

It look as if the compiler simply interchanged the lengths of x and v and this can be confirmed by changing the numbers.

When the word class is replaced by type, the problem goes away.

I believe that the code is valid as it is. Or is it violating some Fortran language restriction that results in this surprising behaviour?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文