Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

2024-04-25

我想通过以下方式实现有用的数组操作(添加元素、删除元素、通过可分配/指针/二叉树结构实现不同的实现)class(*)特征(无限多态性)。我使用 gfortran 5.0 应该可以处理这样的功能。我需要它,以免为我使用的每种类型重复相同的代码。

这应该看起来像

function add_element(array,element)
  class(*),intent(in)::array(:)
  class(*),intent(in)::element
  class(*)::add_element(size(array)+1)
       add_element=[array,element]
end function

问题是,当我尝试将此函数与某些确定类型一起使用时,返回结果时出现错误。我无法分配class(*)到一些明确的类型变量没有select type,我当然不希望每次使用它时都选择类型结构。在子例程中,我不应该知道我想要使用的任何类型,因为我将创建其中的许多类型。

我尝试了一些变体move_alloc,来源,尝试使用子例程intent(out)争论等等。它不起作用。我认为它应该在参数属性中定义,与大小相同(带有源关键字?),但在标准中没有找到此类结构的示例或定义。当然,我会更多地研究这个标准(我不是专业程序员,而是物理学家,试图使我的程序可测试、可检查并且更容易更改),并且现在将简单地重复此代码以等待更好的解决方案,但也许有人知道在哪里在标准或某本书中搜索它?我认为这不仅与数组有关,还与使用class(*)无论如何,我认为应该有一些不知道类型的方法......

不知道我是否应该添加该子例程的其他无效形式的示例或它对错误的说明 - 否则问题将失去焦点。它可以被编译,但在所有情况下,在调用中分配给明确的类型都不起作用。为了论证intent(out) or (inout)它不能从虚拟论证转变为实际论证。从源重新分配会生成一个具有类型的对象(以及在我的示例中分配的结果),但该类型是隐藏的......并且我无法在子例程中使用选择类型,因为我不知道该类型。

另外,我不知道可以检查“相同类型”或在这种情况下的某些内容的构造......


这不是一个简单的问题您可以使用select type,但是 Fortran 没有类似的东西type is(type_of(x))。另一方面,还有SAME_TYPE_AS() and EXTENDS TYPE_OF()内在函数,但不能将它们用作类型保护。

有必要确保两者的动态类型array and element是相同的。

我认为这是标准的缺陷。

但是,您的方法仍然存在错误。您应该使函数结果可分配,以便能够将其分配给正确的动态类型:

class(*), allocatable ::add_element(:)

您可能会想到以下内容:(未经测试!使用 gfortran-4.9 ifort14 进行编译)

allocate(add_element(size(array)+1), mold=array)

但如何实际转移这些值我不知道,我担心如果不诉诸一些肮脏的伎俩,这可能是不可能的。

你甚至不能使用transfer这就是我看到的真正的缺陷。即使你可以用多态模具调用转移

transfer(element, add_element(1))

你无法将它分配给数组元素

add_element(1) = transfer(element, add_element(1))

我的观点是 Fortran 缺乏类型保护选项,只能确保两个变量具有相同的动态类型。

您可能会想到以下内容:(未经测试!使用 gfortran-4.9 ifort14 进行编译)

function add_element(array,element)
  use iso_c_binding
  implicit none
  class(*),intent(in)::array(:)
  class(*),intent(in)::element
  class(*), allocatable ::add_element(:)
  type(c_ptr) :: tmp

  interface
    function memcpy(dest, src, n) bind(c)
      use iso_c_binding
      integer(c_intptr_t),value :: dest, src
      integer(c_size_t) :: n
      type(c_ptr) :: memcpy
    end function
  end interface

  allocate(add_element(size(array)+1), mold=array)

  tmp = memcpy(loc(add_element(size(array)+1)), &
               loc(array), &
               size(array, kind=c_size_t) * storage_size(array, c_size_t)/8_c_size_t )
  tmp = memcpy(loc(add_element(size(array)+1)), &
               loc(array(1)), &
               storage_size(element, c_size_t)/8_c_size_t )

end function
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作 的相关文章

  • HTML 表单:POST 对象数组

    提交班级名单 一次添加3名学生 每个学生都有最初 最后的年龄 问题 我们如何才能将所有学生放入数组中 students 0 gt Array first gt first name for 0 last gt last name for 0
  • 添加到数组连续数字

    这是我向SO提出的第一个问题 我希望能答对 在 PHP 中 如果你不会 Python 或伪语言也可以 给定一个包含 n 个元素的数组 old array 1 2 3 5 7 8 9 20 21 23 29 我需要向新数组添加连续数字 如果不
  • 使用 None 值从 Python int 列表初始化 numpy 掩码数组

    正如问题的答案所示将具有 None 值的 python 列表转换为具有 nan 值的 numpy 数组 https stackoverflow com questions 19456239 convert python list with
  • 二维数组中的寻路

    假设我有这个二维数组地图 0 0 0 0 7 1 1 1 1 1 1 1 1 0 7 7 7 7 1 1 1 24 1 1 1 1 0 7 24 24 24 24 24 24 24 1 1 3 1 0 7 23 23 23 23 23 23
  • 将键值对添加到数组中的所有对象

    我想向数组中的所有对象添加一个键 值参数 eg var arrOfObj name eve name john name jane 现在我想向所有对象添加一个新参数 isActive 以便生成的数组如下所示 eg name eve isAc
  • 从 MySQL 列创建 PHP 数组

    mysql fetch array会给我一个获取行的数组 从一列中所有行的值生成数组的最佳方法是什么 您可以循环遍历数组并创建一个新数组 如下所示 column array while row mysql fetch array info
  • 在 Ruby 中从一个数组减去另一个数组

    我有两个任务数组 创建和分配 我想从创建的任务数组中删除所有分配的任务 这是我的工作代码 但很混乱 assigned tasks user assigned tasks created tasks user created tasks Do
  • 在什么情况下C++会在编译时进行数组边界检查?

    受到 使用编译时 HTML 解析的 C HTML 模板引擎 https github com rep movsd see phit 我正在尝试编写一个示例类来检查字符串中的第一个字符是否是a int dummy 0 class Test p
  • PHP:从 array_values() 内的值中去除标签

    我想在用选项卡爆炸之前将标签从 array values 内的值中剥离出来 我尝试使用下面的这一行 但出现错误 output implode t strip tags array keys item 理想情况下 我想从值中去掉换行符 双空格
  • 如何读取数组中int的随机数

    我想将空格分隔的整数读取到数组中 当我按 Enter 时 它应该在任何时间点停止读取 如何实现该程序的循环 请帮助我解决这个问题 我已经尝试过下面的代码 但它不起作用 以及如何再次读回 include
  • 如何从对应的数组值中获取数组键?

    您可以轻松地通过其键获取数组值 如下所示 value array key 但如果我有该值并且想要它的密钥怎么办 获得它的最佳方式是什么 你可以使用array search https www php net manual en functi
  • Crystal Report:如何计算一个公式中的多个 IF 语句?

    背景 我正在尝试对报告的详细信息行进行一些美观的验证 我有几个名为 Assert 语句的公式 如果测试失败则返回 false 如果通过则返回 true Goal 我想创建一个存储 违反规则 的数组 然后将它们显示在行末尾的字段中 标题为 违
  • 在 Delphi XE 中将类作为过程的参数传递

    我需要做的是这样的 procedure A type of form var form TForm begin form type of form Create application form showmodal freeandnil f
  • 使用另一个对象数组过滤对象数组

    这个问题与这个问题类似Jquery 过滤带循环的对象数组 https stackoverflow com questions 30998424 jquery filter array of object with loop但这次我需要使用对
  • Java:如何实现3和?

    我正在研究 3 Sum 来自己实现它 并遇到了以下规则的实现 给定一个由 n 个整数组成的数组 S S 中是否存在满足 a b c 0 的元素 a b c 查找数组中所有总和为零的唯一三元组 注意 三元组 a b c 中的元素必须按非降序排
  • 从 python 中的类调用函数 - 不同的方式

    EDIT2 谢谢大家的帮助 编辑 添加 staticmethod后 它可以工作 但是我仍然想知道为什么我在这里遇到类型错误 我刚刚开始使用 OOPS 并且对它完全陌生 我有一个非常基本的问题 关于从类中调用函数的不同方式 我有一个 test
  • 如何有条件地组合两个相同形状的 numpy 数组

    这听起来很简单 但我想我把它想得太复杂了 我想创建一个数组 其元素是从两个形状相同的源数组生成的 具体取决于源数组中哪个元素更大 为了显示 import numpy as np array1 np array 2 3 0 array2 np
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • C# 中的类和模块有什么用

    有人可以解释一下类和模块之间的区别吗 你什么时候使用其中一种而不是另一种 我正在使用 C 更新 我的意思是相当于 VB 模块的 C 版本 这在很大程度上取决于您所指的 模块 Visual Basic 的模块 C 中没有真正等效的 VB Ne
  • 为什么在 C++ 类中的数据成员上使用像 m_ 这样的前缀?

    许多 C 代码使用语法约定来标记数据成员 常见的例子包括 m memberName对于公共成员 在所有使用公共成员的情况下 memberName对于私人会员或所有会员 其他人尝试强制使用this gt member每当使用数据成员时 根据我

随机推荐

  • 记录到 golang 中的文件

    我从 golang 开始 当我开始构建我的应用程序时 我想从一开始就添加日志记录 这就是我遇到问题的地方 如果我打开一个文件并使用标准日志记录库 我就可以写入文件 就像这样 package main import os fmt log fu
  • Socat串口嗅探

    我目前正在尝试访问连接到应用程序的串行端口的两个方向上的数据 我想做的是 ttymxc0 socat sniff ttyV0 应用程序ttymxc0 是真实端口 ttyV0 是虚拟端口 我发现 socat 命令适用于 Ubuntu 16 0
  • 为什么我仍然收到“已超过传入邮件的最大邮件大小配额 (65536)”错误?

    我遇到了众所周知的 WCF 错误 已超出传入消息的最大消息大小配额 65536 要增加配额 请使用相应绑定元素上的 MaxReceivedMessageSize 属性 在阅读了此错误的前五个 Google 结果后 我仍然不知道我的服务 客户
  • Http PUT 请求到 jpeg

    我收到了如下 HTTP PUT PUT photo HTTP 1 1 X Apple AssetKey F92F9B91 954E 4D63 BB9A EEC771ADE6E8 X Apple Transition Dissolve Con
  • 如何使用 Spring Security 和 Spring Session 从多个服务器获取相同的会话

    很抱歉我的英语还是不太好 请耐心等待 希望您能理解我的问题 我有两个网络服务器 每个网络应用程序都是相同的 Web 服务器共享一台 Redis 服务器 我使用 Spring Security 和 Spring Session 当我登录第一台
  • jQuery ajax 基于父类别的无限动态选择框

    我有一个类别表 category id category name parent id 1 Electronics 0 2 Mobile Phones 1 3 Computers 1 4 Iphone 2 5 Samsung Galaxy
  • R 中 read.table() 函数中的多个 na.strings

    我有一个方桌 它有两个 na strings 例如 A 和 B 我需要将其转换为 NA 到目前为止 我可以将其中之一转为 NA 但不能同时转为 NA 我该怎么做 我可以在该参数中使用函数吗 如果是 我应该使用什么功能 我尝试过像 na st
  • Android 开发应用程序生命周期结束

    我目前正在编写一个应用程序 最终将推向市场 但目前它仍处于 Alpha 阶段 我正在尝试想出 定时炸弹 应用程序的最佳方法 因此如果它在特定日期之后运行 它将提示用户说 alpha 应用程序已过期并关闭 我不会对市场上的应用程序执行此操作
  • 如何在 Visual Studio Community 2015 中更新 Xamarin for Android

    我最近安装了 Visual Studio Community 2015 并且一直在关注 MSDN 教程 当设计应用程序的外观时 我选择了 Resources layout 文件夹中的 Main axml 文件 Android 设计器失败并显
  • 将 XML 绑定到 ItemsSource 时应用动态 XPath 表达式

    我有一个 XML 文档 描述如何为用户输入构建 UI 元素 并且有包含一些数据和 XPath 表达式的数据对象 我有一个数据对象类型的 DataTemplate 它使用 HierarchicalDataTemplate 来构建基于 XML
  • 基于复选框构建 SQL 查询

    假设我有一个表单 其中有 30 个与音乐流派相对应的复选框 它提交给 PHP 表单处理程序 我有一个艺术家表 其中有一个流派字段 构建具有以下行为的查询的最佳实践是什么 从艺术家中选择名称 其中genreid 1 ORgenreId 2 O
  • if else 在存储过程sql server中

    我创建了一个存储过程 如下所示 Create Procedure sp ADD USER EXTRANET CLIENT INDEX PHY ParLngId int output as Begin SET ParLngId Select
  • Python 脚本未在 cron 中运行

    我正在尝试从 cron 运行 Python 脚本 我使用 crontab 以用户身份而不是 root 身份运行命令 我的 Python 脚本的 shebang 位于顶部 usr bin env python我做到了chmod x它使脚本可执
  • 发生未知错误:用户在 Xcode 13.3 上拒绝了 github.com (-17) 的证书

    我遇到了这个奇怪的错误 每次我尝试将本地 git 存储库推送到 Github 时 这个错误都会让我烦恼 希望有人能帮我解决这个奇怪的事情 我的工作环境 Xcode 13 3 就我而言 网络调试代理导致了这个问题 看来 Xcode 固定了 g
  • 为什么 IE 不解析从 WCF 数据服务返回的 XML?

    我目前正在运行 IE8 并正在使用 WCF 数据服务进行一些测试 当我在浏览器中调用我的一个集合时 我得到 您正在查看的提要包含经常更新的内容 消息 并且不会显示任何 XML 因为它不能理解 Atom 内容元素 不过 我可以轻松地在 Chr
  • 将多个工作表导入到 R 中的多个数据框中

    我有一个包含很多工作表的 Excel 文件 我需要一个代码来将每个工作表导入到单独的数据框中 该数据框架的命名方式与 Excel 中的工作表名称相同 例如 选项卡 A B C 将分别作为数据框 A B 和 C 导入 从其他线程中 我看到了这
  • 无法从“int *”转换为“int []”?

    我知道这可能是一个常见问题 但我尝试搜索但仍然找不到明确的答案 我有以下代码 int f int a 1 2 3 return a int main int a f Error here getch return 0 此代码产生错误消息 C
  • 无法在后台任务中调用 Task.Run()

    我想在后台任务的线程中做一些事情 所以我尝试使用 Task Run 但它不起作用 任何人都可以向我展示另一种在后台任务中创建线程的方法 这是我的代码 public sealed class KatzBackgroundTask IBackg
  • 无法将属性与数字进行比较。错误:“‘AnsibleUnsafeText’和‘int’实例之间不支持”

    getent database passwd debug var getent passwd dict2items selectattr value 1 gt 1000 map attribute key list 输出是 TASK deb
  • Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

    我想通过以下方式实现有用的数组操作 添加元素 删除元素 通过可分配 指针 二叉树结构实现不同的实现 class 特征 无限多态性 我使用 gfortran 5 0 应该可以处理这样的功能 我需要它 以免为我使用的每种类型重复相同的代码 这应