问题标签 [silverfrost-fortran]
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.
fortran - 如何在 Fortran 95 中包含来自不同文件的模块?
我认为这个问题很明显,虽然我用谷歌搜索了它,但我找不到任何解决方案。我想拆分我的源代码以使其更易于维护。如何引用另一个文件中的模块?
fortran - 为什么 silverfrost 和 gfortran 的结果不同?
当我使用Silverfrost fortran运行我的代码时,结果是-2.987531633638E-02
. 但是对于gfortran(在 cygwin 和 ubuntu linux 下)它是-2.9875316336381942E-002
. 我的代码在这里:
两种结果之间存在巨大差异。我无法将这种差异的原因解释为浮点不准确。
注意:我的代码是草稿版本,没有物理意义。
fortran - 在另一个子程序中定义一个子程序
Fortran 是否可以在另一个子程序中定义一个子程序?当我尝试类似
我的编译器(Silverfrost)给了我一个递归错误。
fortran - 当需要实数时,尝试将带有参数的例程作为过程调用
我有一个可以毫无问题地编译的 Fortran 程序,但随后出现错误:
当需要 real(kind=2) 时,尝试将参数编号为 1 的例程作为过程调用
ROOTS!X_ROOT - 在文件 exercise2base.f90 的第 20 行 [+0074]
main - 在文件 exercise2base.f90 的第 65 行 [+00c8]
我真的不知道这意味着什么,我想这可能意味着我将一个参数传递给了某个类型不正确的函数,但是给出的引用没有意义:
- 第 20 行是
end function x_rtsmpl
- 第 66 行是
answer=x_root(bb_integral,l1,l2,epsx,epsf,root_type)
所以我不明白发生了什么...
我在 Plato IDE 中使用 Silverfrost。
编辑:代码现在一直修剪到它的基本功能,只有声明和简单的“虚拟”计算。
windows - Fortran Silverfrost 编译器创建无法删除的 .exe
我在新计算机上使用 Windows 10,而不是在工作中。有时,我的 Silverfrost 编译器(截至 2017 年 7 月 28 日最新)会时不时地创建一个 .exe 文件,请求管理员权限删除、移动或修改。问题是,我是管理员,文件不在乎。
我尝试以管理员身份删除它,我尝试以管理员身份运行命令行并删除它,我尝试修改其所在文件夹的权限以递归地赋予我权限,但没有任何效果。我可以删除它的唯一方法是从 linux USB 启动我的 PC。
fortran - 调试访问冲突错误:写入 2071E05A0 而不是 3071E05A0
最终编辑:
silverfrost 论坛上的一些用户非常有帮助地指导我简化代码和解决方案。
可以使用以下代码复制该问题:
该问题仅在MXAV
>182 时出现,这表明存在内存问题。实际上,将尺寸相乘:183 * 1714 * 1714 * 4 会产生 >2GB,超过堆栈大小。
一种解决方案是按如下方式使用堆(Fortan 95):
完成此操作后,我们可以分配超过 2GB 的空间,并且数组可以正常工作。这段代码源自的程序已经有几年历史了,我们现在才遇到这个问题,因为我们构建的模型比以前大很多倍。由于 Fortran 77 不允许 ALLOCATABLE 数组,我们必须要么减少堆栈使用,要么移植代码 - 或寻求另一种优化。
编辑添加:
我现在整理了一个包含可重现代码的 git repo。
概述
我有一个程序在编译为 32 位时运行良好,但在编译并以 64 位运行时出现访问冲突错误。
我正在使用 Silverfrost Fortran 编译器 FTN95 v8.51,尽管使用 v8.40 和 v8.50 会出现此问题。
示例代码
注意该函数zonedef
只是检查一个区域对于我们想要进行的计算是否有效。此函数返回一个logical
.
调试
正如我最初提到的,这个程序的 32 位编译版本运行良好。尝试运行 64 位版本时,第一个循环的输出如下:
来自 sdbg64.exe:
将异常写入文件:
剩下的……请多多包涵。无论如何,我都不是受过训练的软件工程师或 fortran 开发人员,所以我在黑暗中刺了一下以进行故障排除。
的值为ZNZNDAAV(1,337,337,1003)
2.241640,并且正在添加到ZNZNDAAV(1,337,1714,1003)
. 这与异常输出中详述的寄存器 XMM11 相符。该值位于 address 000000029BA3BD60
。另一个值在 address 00000003071E05A0
。
IIUC,在 relocmon.inc 中,我们设置COMMON /DDMON/
为包含维度数组znzndaav
,因此如果软件名义上工作,则相关值的地址将在/DDMON/
块内。的地址范围/DDMON/
是z'000000027FFF6040' - z'0000000307421150'
。如果我的逻辑是正确的,则违规发生在此块之外。
在我看来,该程序正在尝试写入00000002071E05A0
它应该使用的时间00000003071E05A0
。
谁能帮我确定为什么会这样?似乎有一些系统性的东西——这仅仅是巧合吗?
gcc - GMP 是否适用于 gfortran?Silverfrost Fortran 是否有任意精度的算术选项?
我正在研究一些 Fortran 的东西,可能是 Fortran90 或 Fortran95,并且想知道 GMP 是否适用于 gfortran 编译器。如果是这样,如何在 gfortran 中使用任意精度算术?另外,Silverfrost Fortran 编译器是否有任意算术选项?gfortran 或 Silverfrost 是否支持 Java 的 BigDecimal 之类的东西?
c++ - 借助C++在Matlab中调用Fortran DLL
我有一个 fortran 代码,想在 MATLAB (2019) 中运行它。我想坚持使用 silverfrost(64 位)编译器 (FTN95) 来编译我的初始 fortran 代码。为了了解它是如何工作的,我从 Fortran 中的一个简单代码开始:(multiply.f90)
我将其编译为 dll 数据并在 C++ 中使用此 dll 生成 C++ dll(64 位)以在 MATLAB 中使用它。C++ dll 在 Visual Studio 2015 中生成。这是我的 C++ 代码 (Cppdll.cpp):
和相应的头文件(Cppdll.h):
我将这些 dll(multiply.dll 和 Cppdll.dll)放在 MATLAB 路径中,并在程序中加载 Cppdll。通过加载 dll,MATLAB 不会抱怨,但是当我调用 dll 函数(例如calllib('Cppdll','DLLRes',2.1,5.23)
)时,MATLAB 意外崩溃,即它通常在开始时工作并且结果是正确的,但在一段时间后,MATLAB 崩溃时出现/不出现错误消息。错误消息(如果显示)是不同的,但它们都抱怨 Silverfrost 异常处理程序:
[notfound,warnings] = loadlibrary('Cppdll.dll','Cppdll.h')
我还应该提到 MATLAB 在我运行命令时给了我以下警告:
我在哪里犯了错误以及如何解决这个问题?
提前谢谢!
fortran - Fortran 中用于三角函数的双精度
我正在使用以下代码cos
计算pi/2
in Fortran
。
gfortran
我使用和编译ftn95
。两者的输出是
我如何在angle
这里获得更好的精度?例如在C++
我看到它的顺序是E-18
, 对于所有声明使用double
.
如果需要更多信息来更好地解释它,请告诉我。
额外:我正在使用的主要代码,物理方程具有三角项,存在精度问题,我不完全确定,但我怀疑是因为这个。所以,想检查一下上面是否可以以某种方式改进。不是专家Fortran
如此努力地弄清楚这一点。