问题标签 [fortran2003]
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.
gdb - 使用 gdb 在 Fortran 中打印可分配数组:未处理的 dwarf 表达式操作码 0x97
我使用 gdb 作为调试器在 Cygwin 和 Eclipse 中调试了以下代码:
运行 gdb 时,我尝试在分配后打印可分配数组“vector”,但最终得到以下结果:
我已经搜索了 Stack Overflow 和 Google,但我没有找到任何触及问题核心的东西。我检查了以下内容,
- http://numericalnoob.blogspot.be/2012/08/fortran-allocatable-arrays-and-pointers.html
- 未处理的侏儒表达式
- Fortran在gdb中打印可分配数组
但我仍然不明白问题是什么或如何解决它。在尝试打印/显示派生类型的内容时,我在 Eclipse(Mars.1 Release,4.5.1)中从 gdb 得到了同样的抱怨。关于我的机器/编译器/调试器的当前规格包括以下内容:
- 视窗 8.1
- gfortran 版本:GNU Fortran (GCC) 4.9.3
- gdb 版本:GNU gdb (GDB) 7.8
任何帮助表示赞赏。
fortran - Fortran:如何使多个程序共享同一个程序接口
我有一个看起来像的代码
但是,这两个子例程sub1
都sub2
使用相同的接口来实现虚拟功能f
。如何使这两个程序共享相同的界面(例如使用模块)?我必须使用过程指针吗?
oop - 对用户完全隐藏对象是一个好的设计吗?
我正在用 Fortran 90/2003 编写一个简短的模块,它提供了一个简单且用户友好的界面,用于计算程序执行的不同部分之间的时间。受 Matlab 中的tic
,tac
命令的启发,其想法是用户在程序中使用该模块,如下所示:
现在,我知道如何使用Fortran 内在函数实现该结果。我的问题是我应该怎么做。我这样做是为了学习好的设计实践,而不是 Fortran 语法。
我已经定义了一个名为 的用户定义变量Timer
,它是我用来实现该功能的主要对象。然而,有(至少)两种不同的方式来使用这个对象让用户使用多个计时器:
a)我可以将用户定义的变量Timer
公开,然后强制用户手动创建计时器对象。用户必须根据需要创建尽可能多的计时器,然后使用方法来处理它们。
b)我可以通过将其设为私有来隐藏此类型。然后,为了存储不同的计时器,我在模块中创建了一个对象数组Timer
作为全局变量,虽然对于模块来说是私有的,并且每次用户调用子例程Tic
时,都会在这个数组中定义一个新的计时器。在上面的示例中,用户正在使用按照后一种方法实现的模块(请注意,该程序根本不使用关键字type
)。
尽管这两个选项在技术上都有效(我已经实现了),但每个选项都有优点和警告,而且我所知道的关于软件设计的规则不知何故发生了冲突。从“正统”的角度来看,我想知道哪种方法最好。
选项 a) 具有更好地遵循 OOP 的优点:用户显式创建对象并使用它进行操作。它不使用任何全局变量。
选项 b) 的优点是被更强烈地“封装”。我的意思是用户甚至不需要知道 aTimer
是什么,甚至不需要知道它的存在。此外,提供的与Timer
对象交互的接口只是一个简单的字符串,使得整个模块对用户来说更加不透明,不需要特意定义Timer
变量。他/她只使用模块提供的两个接受字符串作为输入的子例程。就这样。问题是我觉得这种基于为整个模块定义的数组的设计违背了避免全局变量的规则。它不是真正的全局变量,因为它是私有的,但仍然如此。
那么有这两种选择,我应该选择哪一种来产生最正统的方法?
PS:也许还有第三种选择,它允许用户间接创建对象,而无需访问用户定义的类型(即不仅仅是在现有数组中定义元素,就像在解决方案 b 中所做的那样)。我不知道这是否可以在运行时创建变量。在这个方向上的任何想法也非常受欢迎。
oop - 如何在简单的物理模拟中设计有意义的对象及其关系
我正在尝试使用 OOP 范例设计一些简单的实时模拟。我面临的问题是,由于我缺乏这种方法的经验,我不知道如何以自然的方式定义“正确”的对象及其关系。因此,我的问题更接近于软件架构,而不是更技术性的“如何实现这个或那个”。请注意,我正在做这个练习正是为了了解这个编程范式。
模拟试图解决空二维空间中粒子之间的相互作用(碰撞、吸引力等)。我想到的第一个对象是Particle
。我已经用位置、速度、质量等实现了这个类。我创建了启动它们的方法,更新它们的位置(根据一些物理规则)甚至在画布中绘制它们。现在,我的问题出现在设置物理常数或绘图参数(画布大小、窗口数、每秒帧数等)时。现在我正在使用全局变量,例如重力或画布大小。这就是在非 OOP 方法中会做的事情,并且它仍然有效。但我一直在努力思考纯 OOP 如何处理粒子之间的共享参数。我可以预见各种选择。
- 我可以
Canvas
使用图形参数和Universe
重力等常量创建类。然后,该类Particle
将是一个扩展类。但我应该从哪个继承?尽管如此,类会得到扩展,但对象本身不会...... - 另一种选择是创建
Universe
和Particle
作为独立的类。然后,我将通过创建一个独特的 Universe 对象来关联它们。每个粒子都包含一个指向此类 Universe 对象的指针,因此它们可以访问物理参数。我不确定这种指针方法是否甚至是 OOP ......
尽管我知道有很多方法可以做到这一点,但我想知道至少从学术角度来看,是否有一种更直观和“标准”的方法。我想它不包含在我提出的解决方案中,因此任何关于如何在这种简单模拟中设计结构的提示都将非常受欢迎。
fortran - 使用隐式执行循环写入文件
我需要有关 Fortran 中隐式执行循环的帮助。这是我的简单代码:
这是文件First.txt
:
当我尝试执行这个程序时,我收到了一条消息:
我想在写语句中保留整数变量 N 和 M 的名称。有没有办法让他们的价值观也不受声明部分的影响?
oop - 派生类型和扩展类型构造
我对 Fortran OOP 很陌生,并且在初始化父类型和派生类型时遇到了一些问题。我有一个包含父类型的模块object
(对不起这个词的过度使用..)和它的派生类型circle
,它有额外的radius
字段。
我现在需要初始化object
类型的方式需要对半径使用虚拟参数,我想避免这种方式。所以目前我有什么工作,但我想知道一种更好的方法来做到这一点,因为如果我object
将来需要进一步派生类型,它似乎不太实用。
我想在这个意义上使用object
作为抽象父类型会有所帮助吗?或者使用通用程序,但我真的不知道该怎么做。
代码如下。
fortran - 警告“这里的基本内在函数是整数或字符类型”
我的代码中有一行
我用它编译它ifort /stand:03
并警告我
fortran-learning.f90(3):警告 #6009:Fortran 2003 指定此处的基本内在函数是整数或字符类型,并且每个参数必须是整数或字符类型的初始化 expr。[晒黑]
这是什么意思?
oop - 是否可以在 Fortran 中将矩阵声明为派生类型?
是否可以在 Fortran 中将矩阵声明为派生类型?例如,可以做一些事情以便调用
已验证?在哪里inv
被声明为一个程序four_by_four_matrix
?
fortran - Fortran中派生类型数组的破坏
我使用 gcc 5.2.0 和 6.1.0 的以下代码出现分段错误。
我得到的结果是,
如果我用英特尔编译代码,它就会运行。但结果不是我所期望的。
为什么不调用 b 类型的析构函数?
在所有这些测试中都禁用了优化。
fortran - 在 SELECT TYPE 块中释放
在下面的示例中,我尝试在子例程中释放分配的字段deallocate_arbitrary
。这应该适用于最终用于多种类型的无限多态指针,但在示例中,只有整数数组的版本用type is (integer)
.
SELECT TYPE
块内f
指向无限多态指针field
。我的假设是它f
的类型是integer
,并且应该可以释放数组f
指向的点。Ifort 14 不编译此示例并显示错误消息:
我假设f
将是一个指针,因此它可以被释放。有没有办法以这种任意方式解除分配,或者 Fortran 2003 标准不可能做到这一点?