问题标签 [allocatable-array]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
411 浏览

python - 在 f2py 中使用模块中的可分配数组

我在f2py. 在下面的代码(存储在mymod.f90)中,我创建了两个模块,vars并且worker

  • vars存储和分配数组b
  • worker包含用于处理此数组的子例程,来自vars.

第一个worker- 子例程将标量添加到b. 这按预期工作。问题在于下一个例程应该向数组添加一个匹配的第一维向量b。实现的子程序add_vector2可以工作,但需要vector传递输入的维度。

我需要的是一个只有向量作为参数的子程序,比如注释掉的子程序add_vector1。但是,这不能与f2py(但与gfortran)一起编译。

这是代码:

这可以编译为

在蟒蛇中:

我怎样才能add_vector1(使用相同的参数/调用)使用f2py

编辑1:

这是来自的错误消息f2py

编辑2:

一种选择可能是创建一个包装器,例如这个 ( wrapper.f90):

但是,用它编译f2py -m wrapper -c mymod.f90 wrapper.f90仍然会导致f2py无法编译的相同问题mymod.f90。整个事情应该可以用作numpy扩展。

0 投票
1 回答
639 浏览

string - 在 Fortran 中读取带有名称列表的可分配字符串

由于 Fortran 2003 可以使用可变长度的字符串。我不想以过时的方式工作并声明一个恒定的字符串长度,而是动态地读取我的名单的字符串。

考虑程序

以及包含在以下 namelist.txt 文件中的小名单:

如果我使用带有积极调试标志的 GCC 8.2.0 进行编译,我会得到

在运行时,没有打印任何内容,这会出现:

并且使用具有类似调试标志、没有编译时标志和以下运行时错误的 Intel 编译器 17.0.6:

这表明名称列表功能无法“自行”分配可变长度字符串,因为如果我添加该行

错误消失。这是预期的行为吗?还是编译器的缺陷?

0 投票
0 回答
251 浏览

arrays - 为什么将可分配数组作为自动数组传递给形状错误的子例程时,gfortran 的运行时边界检查不起作用?

我编译以下程序gfortran -g -fcheck=all -Wall bug.F90

运行程序时,它不会因运行时边界检查错误而退出。为什么会这样?这是 gfortran 缺少的功能,还是有根本原因为什么这样做是个坏主意?

我知道在某些情况下重新解释具有不同形状的数组可能是有意义的(我猜这在 Fortran 标准中是允许的),例如从 2D 数组到展平的 1D 数组,但在这些情况下元素计数不会改变。重塑为较低的元素数量也可能很好,但绝对不是较大的元素数量,这就是上面发生的情况。

编辑:为了证明程序确实在写入无效的内存地址,我使用电子围栏工具运行它:

同样,在valgrind下运行程序给出:

0 投票
1 回答
442 浏览

arrays - Fortran 中 0 大小数组的数组边界

在 Fortran 中分配零大小的数组时,我遇到了违反直觉的行为。

这段代码:

产生以下输出:

我的编译器 (gcc/gfortran 6.2.0) 是否符合标准?我不明白为什么lbound(a,1)==1而不是lbound(a,1)==0,因为总数组大小为零元素。谢谢!

0 投票
1 回答
145 浏览

fortran - 使用未在数组赋值中分配的可分配数组

在 Fortran 中,如果我使用未在数组赋值中分配的可分配数组,我预计会出现一些运行时错误。但事实证明,可分配数组是在分配期间分配的。这似乎是一个危险的设计。有人可以解释这种设计的原因吗?示例代码如下:

我用 gfortran 编译了上面的代码。运行代码表示den_i_right变成了一个形状相同的数组a

0 投票
1 回答
638 浏览

module - 如何跨子例程处理模块中的 Fortran 全局可分配变量

我有一个带有可分配变量的模块,该变量在模块中定义,在子例程中分配,然后也用于第一个子例程调用的第二个子例程中。在这种情况下,我是否必须将变量传递给第二个子例程并声明INTENT(inout)?或者因为它是一个全局变量,所以不需要作为参数传递?

0 投票
1 回答
518 浏览

fortran - Fortran(重新)分配分配和 gfortran 警告

一个简单的代码:

编译上面的代码:gfortran-8 -std=f2008 -fcheck=all -Wall -Wextra -fbounds-check -fimplicit-none array.f90

我收到以下警告:

Warning: ‘a.offset’ may be used uninitialized in this function Warning: ‘a.dim[0].lbound’ may be used uninitialized in this function Warning: ‘a.dim[0].ubound’ may be used uninitialized in this function [-Wmaybe-uninitialized]

有人知道我为什么收到这些警告吗?

0 投票
2 回答
655 浏览

pointers - 具有可分配或指针属性的无限多态虚拟参数?

在我正在进行的项目中,我发现自己经常需要调整对象数组的大小,因为新对象被创建并且旧对象被销毁。在整个代码中,许多不同的派生类型都会发生这种情况,其中大多数彼此没有关系。编写代码为唯一的派生类型调整这些数组的大小是很乏味的,所以我想我会尝试使用无限的多态虚拟参数编写几个帮助子例程,以便任何派生类型数组都可以使用这些子例程。

我发现我的无限多态例程可以编译和调用CLASS(*),INTENT(INOUT) :: val。此虚拟参数将接受整数、可分配整数或指向整数的指针。但是,一旦我尝试添加ALLOCATABLEorPOINTER属性,子例程就会正确编译,但我无法在没有获得编译器错误的情况下调用它。由于我的目标是能够调整派生类型数组的大小,因此这些属性对于例程能够解除分配/分配/关联值是必需的。

这是一些测试代码,它们甚至没有尝试实际做任何事情但无法编译。此版本使用标量具体类型,但在使用具体类型数组或派生类型数组的原始代码中也会出现相同的错误

如图所示,代码产生以下错误:

如果我注释掉错误中命名的 2 行,我会得到以下正确输出:

我已经广泛编写了 Fortran 代码,但以前从未尝试过使用无限多态性。请让我知道我正在尝试做的事情是否可行,如果可以,我做错了什么。

我正在使用 gfortran 编译器 5.4.0,据我所知,它应该完全支持无限多态性。

0 投票
1 回答
548 浏览

pointers - Fortran中用户定义类型的嵌套数据结构

我正在寻找一种在 Fortran 2008 中使用用户定义类型构建树结构的方法。虽然我可以让一些基本代码正常工作,但我遇到了无法查明的内存泄漏。

树结构不必过于通用,因为它被用作一次性插入和多次读取的存储,这就是我决定使用可分配的原因。由于 Fortran 不允许将可分配的类型用作其自己的成员之一,因此我使用由指针引用的中间结构来存储该可分配。因此,以下是我想使用但不允许的:

在下面的示例中,我使用了指向持有可分配对象的类型的指针的延迟分配(仅在有要添加/存在的子节点时才分配)。

gfortran(7 和 9)开始,flang我得到了nagfor源自.allocate(constructor%subsections_)constructor

这里来自gfortran-7并使用-fsanitize=address

我正在寻找替代实现(但最好是类似的优雅初始化)或内存泄漏的解释和可能的解决方案。

0 投票
1 回答
67 浏览

fortran - Fortran 子例程在多次迭代后忘记了可分配的数组元素值

我有一个具有以下结构的 fortran 程序。该程序因“分段错误”错误而崩溃,因此我对根本原因进行了很多挖掘。

原来,在子程序 SUB1 中,当 DO 循环计数器变量 I 达到 187606 的值时,原来从外部文件中读取为 28.29 的 Z(608673) 的值莫名其妙变成了 3.9809702045652999E-309,即使在从外部文件读取后没有任何计算会改变任何 X、Y 或 Z 数组的值。

我怀疑许多其他数组元素值也被程序在执行中途设置为任意数字(可能在零附近) - 尽管鉴于数组的大尺寸不可能明确检查这一点 - 但本质上这是是什么导致程序崩溃(这些值在程序的其他地方使用)。

所以主要的问题是:为什么数组元素值被程序任意重置,尽管这些数组保存在 MODULE VARIABLES 中并且该模块被所有相关例程使用?SAVE 语句不是用来保存数组的值吗?

注意:我尝试在 [a] 具有 16 GB RAM 的 Ubuntu Linux Dell 笔记本电脑(没有运行其他需要大量内存的程序)和 [b] 具有 16 GB RAM 的 Windows 笔记本电脑上运行此代码。在这两台机器上,我都使用了 gfortran 编译器,并且出现了同样的问题。对于较小的 N 值,代码似乎运行良好 - 只有非常大的数组是一个问题。

文件 vars.f90

文件分配.f90

文件解除分配.f90

文件 main.f90

文件 datafile.txt(小样本):