小编why*_*n0t的帖子

分配数组时出错

我有一个子程序,它在程序运行期间被调用了很多次。我尝试使用尽可能多的可分配数组,并且多次调用子例程没有任何问题,但在某些时候,它终止于:

malloc.c:3790: _int_malloc: Assertion `(unsigned long)(size) >= (unsigned long)(nb)' failed.
Run Code Online (Sandbox Code Playgroud)

当第一个数组被分配时,这发生在子例程的开头。

改用不可分配的数组,子例程被多次调用但再次终止,现在:

 wait: 28674: Memory fault(coredump)
Run Code Online (Sandbox Code Playgroud)

我假设它在调用时终止,因为我在变量声明后立即写出一些值,没有任何计算。
呼召

do k=1, kreise
     write(*,*)k 

     call rundheit(n(k),kreis(k,1:n(k),3),kreis(k,1:n(k),2),outrnd)

end do
Run Code Online (Sandbox Code Playgroud)

其中 'kreise' 的值可能高达 1500。我打印出并检查了在调用之前、子例程中和调用之后传递的参数的值。

限制 'kreise' 确实解决了问题,但限制不是一个实际的解决方案。我需要评估所有数据。不是它的断裂。

对我的环境的一些说明:
我的程序是使用英特尔 Fortran 编译器由 FEM 仿真软件编译的子例程。据我所知,我没有机会改变编译器选项,我也不能自己编译我的代码,因为它对 FEM 软件部署的子程序有很多依赖。

我在另一个更小、更简单的 Simulation 上开发并运行了这个精确的子程序,没有任何问题。只要我不使用这个特定的子程序,实际的、“更大的”模拟运行也没有任何问题。(差异主要在于节点密度,因此计算过程中考虑的数据量)其他用户子程序工作没有问题。所有子程序所做的就是在一些增量之间获取结果,进行一些分析并编写一些报告而不改变模拟。

我猜这个问题与内存处理有关,我不知道。

谢谢。

更新
我使用编译子例程-check all并发现错误发生在被指责的子例程之前。两个数组,其中一个是 n(),多次越界,但在调用时错误变得(更)严重。奇怪的部分是,当错误发生时,它是一些超出界限的迭代,例如:这里两个数组都有大小(1:72),调用在 k=135 到 267 的某个地方中断(我在某些运行中发现的最低和最高值)。

问题是 integer Kreise,该值是在循环期间设置的:

...
allocate(n(l))
allocate(pos(l))
...
do kreise = 1,l
   pos(kreise)=minvalX+(Kreise-1)*IncX
   if(pos(kreise).gt.maxvalX) exit
end do
Run Code Online (Sandbox Code Playgroud)

kreise八方通变为L + 1。为什么? …

malloc fortran allocation

5
推荐指数
1
解决办法
4919
查看次数

forrtl:warning(402):堡垒:(1)

我在运行时收到以下警告:

...
forrtl: warning (402): fort: (1): In call to I/O Write routine, an array temporary was created for argument #2

forrtl: warning (402): fort: (1): In call to I/O Write routine, an array temporary was created for argument #3

forrtl: warning (402): fort: (1): In call to GERADHEIT_LINIAL, an array temporary was created for argument #2

forrtl: warning (402): fort: (1): In call to GERADHEIT_LINIAL, an array temporary was created for argument #3
...   
Run Code Online (Sandbox Code Playgroud)

对于子例程/写入语句的每次调用.

子程序的调用:

integer :: l,kreise …
Run Code Online (Sandbox Code Playgroud)

arrays fortran intel-fortran

5
推荐指数
1
解决办法
4021
查看次数

循环后Fortran DO循环索引的值

DO循环如何正常工作?

假设你有以下循环:

do i=1,10
...code...
end do

write(*,*)I
Run Code Online (Sandbox Code Playgroud)

为什么打印I 11,而不是10?

但是当循环停止时由于

if(something) exit
Run Code Online (Sandbox Code Playgroud)

我是预期的(例如i = 7,退出因为其他一些值达到了它的极限).

fortran loops do-loops

2
推荐指数
1
解决办法
1055
查看次数

Fortran 格式的浮点数输出

Fortran 中有没有办法将浮点数写为 ,17,3而不是17.3将点更改为逗号?

我有一些通过子程序写入 .csv 的大型数据集,我想在上面做一些 Excel。德语版的 Excel.用作浮点数的分隔符。我知道我可以使用导入功能来处理它,或者使用 Nodepad++ 搜索并替换.,. 但是我确实生成了很多这样的文件,并且其他人将使用该子例程,因此准备好 Excel 的文件会很好。

excel fortran localization output

0
推荐指数
1
解决办法
555
查看次数