问题标签 [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.

0 投票
2 回答
3420 浏览

fortran - SELECT TYPE 具有指向 CHARACTER(*) 变量的无限多态指针

下面的示例使用Fortran 2003定义无限多态指针和基于select type构造后面的变量类型执行操作的功能。该子例程handleP根据参数的类型打印参数的值。

gfortran使用4.8 版编译会得到以下输出:

因此,call handleP(mystring)一切都按预期工作,但call handleP('Initial')打印失败。带type(name)参数调用也有效。

call handleP('Initial')gfortran错误的行为还是我做错了什么?如果它是一个错误,我能做些什么来防止它?

0 投票
1 回答
1263 浏览

types - Fortran 2003 中参数化派生类型的问题

我正在自学 Fortran 2003 用于我目前正在进行的研究项目。我习惯了 Fortran 90,但是这个项目需要使用参数化类型,所以我要继续使用 2003。

我按照该站点对如何定义参数化类型的描述,并根据该站点的示例编写了一个非常简单的示例程序来对其进行测试:

当我用命令编译它时

我得到错误

当我删除公式的参数化部分时,它编译得很好(也就是说,它可以识别类型)。Fortran 2003 特有的任何东西似乎都特别麻烦,但是当我使用命令运行时

它仍然有同样的问题。可能会发生什么?

0 投票
1 回答
132 浏览

fortran - Fortran:(错误)匹配动态类型

我正在将某个类的变量复制到同一类的另一个中。编译器很乐意编译它,但我担心在运行时动态类型可能会有所不同。我是否需要测试这两个对象是否具有相同的动态类型以防止在正方形中复制矩形,或者我可以信任编译器吗?如果一个矩形被意外复制到一个正方形中会发生什么?

我想做的是以下几点:

编译器(ifort 14)很高兴地编译了这两个版本,但我强烈怀疑 VERSION 1 是错误的。ininit_simVars this%svars将被分配给 dynamic type stateVars, inadd_to_simvars sVars将具有动态类型,并且将尝试stateVars1复制 in this%sVars(of type )。stateVars我很惊讶编译器编译它,即使它无法确定sVarsin的动态类型add_to_simvars。运行时会发生什么,段错误或什么?

版本 2 我认为是正确的,但是我有点不愿意相信这里的编译器,因此我认为我应该ASSERT这样做this%sVars并且sVars具有相同的动态类型(ASSERT(SAME_TYPE_AS(this%sVars, sVars) ))?这是一个真正的问题还是我太担心了?

另一个问题是当我这样做时会发生什么allocate( this%svars(n),source=sVarsIni )。我想将数组分配this%sVars为大小n和动态类型sVarsIni。然而sVarsIni是一个标量。它会做我想做的事吗?

0 投票
1 回答
1192 浏览

fortran - Fortran 90 或 2003 中的访问运算符“[ ]、( )、{ }”重载

我可以为 FORTRAN 2003 中的派生数据类型重载条目访问运算符 []、() 或 {}?在以下示例中,我想为派生数据类型“自定义”定义访问方案。

我怎样才能做到这一点?

更新:

请注意,我不想直接使用数组“t%a”并对其进行常规的子数组操作。相反,我想为数据类型“自定义”重新定义数组操作,这样 t{'first'} 应该返回一个指针,即 t%a 或 t%a(1) 中的第一个条目,所以我可以说

或者

此外,通过额外的重载,我想获得像 t[1] = 18 这样的功能,就像 t['first'] = 18 一样。

0 投票
1 回答
2325 浏览

polymorphism - FORTRAN:数据多态

我试图隐藏真实数据类型和复杂数据类型之间的区别。在 FORTRAN 2003 中,我认为可能有办法做到这一点。

目标是定义一个多态可分配数组,其类型可以在运行时决定。另外,还有一个子程序可以用多态数组来做一些代数(同样的方程适用于真实和复杂的数据)。

为了做到这一点,我做了两次尝试:

方法一:

方法 B(无限多态可分配变量):

然后我在这两种方法中的代数子例程都有问题:在内在赋值语句中,变量不应是多态的。任何建议将不胜感激。

0 投票
1 回答
634 浏览

arguments - FORTRAN:传递无限多态子程序作为参数和其他问题

我正在使用 FORTRAN oop 功能进行编程。现在我有一个子程序,它以另一个子程序作为参数。但我希望子程序以无限多态子程序作为参数以及普通子程序。例如我有:

问题:

  1. 我只被允许将无限的多态子例程传递给“PassFunc”。我无法传递普通函数(没有类(*)的函数)。有没有办法让“PassFunc”具有其他类型的功能?(示例:Func1 有效,但 Func2 无效。我使用 IVF 时遇到了访问冲突,虽然它在编译时没有报错。是否可以使其工作?如果可以,我可以在不修改的情况下使用其他子程序。 )

  2. 在这种情况下,“FuncRes”变量的类型取决于“MyInput”。现在我知道的唯一方法是使用嵌套选择类型。但实际上没有必要这样做,因为“FuncRes”和“MyInput”永远是同一个类型。有没有办法减少嵌套的select类型?(如果我有很多中间变量,那将是一场灾难。)

0 投票
2 回答
756 浏览

compiler-errors - 错误:如果 SELECT TYPE 中的选择器表达式不是命名变量,则应出现 associate-name=>

我正在尝试在另一种类型中使用一种类型。但是,我就是不能让它编译。这对我来说很奇怪:选择类型的东西在主程序中有效,但在类型的子程序中不起作用。

我有一个编译错误select type(this%WF)。但是如果我在主程序中定义一个 Buffer 类型并做同样的事情,就不会出错。

错误信息是:

我怎样才能使这段代码编译?

0 投票
2 回答
301 浏览

compiler-errors - Polymorphism allocation in a SELECT TYPE construct

I am trying to define a subroutine which allocates different types of arrays. Here is a simplified version of the code:

But I got three error messages that I don't understand:

As you can see VEC is an allocatable array, so I don't think this error make sense. What does it mean, and how do I make this work?

I am using IVF XE 14.0.1.139.

0 投票
1 回答
120 浏览

fortran - 当我使用自动重新分配时,派生类型的可分配组件会发生什么?

在我的程序中,我想创建一个容器类型,其中包含某个派生类型的数组。我想为容器添加类型绑定过程,该过程调用数组所有组件上的过程。由于数组的大小不同,我尝试使用自动重新分配功能。我遇到了可分配字符的麻烦。

这是一个小片段,显示了设置:

我用 ifort 编译,使用

启用自动重新分配。输出内容如下:

最后一个条目显示正确。复制数组的旧部分似乎会导致可分配组件出现问题。当我使用固定字符长度时,我不会遇到麻烦。当以这种方式使用自动重新分配时,究竟会发生什么?还有其他选择可以更安全地执行此操作吗?

0 投票
1 回答
213 浏览

fortran - Type bound procedures of polymorphic components of derived types

I am writing some simulation code (almost) from scratch and want to use OOP features from fortran to keep it easier to maintain. I've learned in a fortran workshop, that one should be carefull when using OOP features within performance critical parts of the code.

My naive first approach (ignoring the warning) would be the following snippet. The background is the calculation of a system energy which needs an interaction potential. For this potential, I use an abstract type (potential). All users can then add their own potentials as extensions and define a keyword that is used to allocate their potential. The energy calculation in the main program does not change.

I think my main problem concerning the performance is that I don't get what the compiler actually does at compile time and which things are done at run time.

So my questions are:

  1. How or when does the compiler check, which instance of 'eval' to use?
  2. When the keyword is known at compile time, is there a type check in every iteration of the loop?
  3. Would it be better to, for example, use a procedure pointer in the main program, and associate it at the beginning to the according 'eval' procedure?

Thank you very much in advance!