Fortran 结构体指针

2023-12-03

我在将一个指向结构的指针分配给一个指向结构的指针时遇到问题。 我使用 gfortran 4.6.3,文件名是 test_pointer_struct.f08,因此我使用 Fortran 2008 标准(由 gfortran 4.6.3 支持)。

赫拉来了代码:

PROGRAM test_pointer_struct

type tSmall
  integer          :: a
  double precision :: b
end type tSmall

type tBig
  integer                   :: h
  type(tSmall), pointer     :: member_small
end type tBig

type(tBig)                  :: var_big
type(tSmall), pointer       :: var_small(:)

! We get an array of pointers to the small structure
allocate(var_small(3))
! Also allocate the member_small strucutre (not an array)
allocate(var_big%member_small)

var_big%member_small%a = 1
var_big%member_small%b = 2.0

! Now we want an element of the var_samall array of pointers, to point to the member_small in member_big
var_small(1) => var_big%member_small    ! <- I get a compilation error here

! And dissasociate the member_small (we still maintain access to memory space through var_small(1)
var_big%member_small => NULL()

END PROGRAM test_pointer_struct

当我执行此操作时,出现以下错误: 错误:Se esperaba una especación de límites para 'var_small' en (1) 可以翻译为 错误:'var_small' 的预期限制规范为 (1)

这个错误是什么意思?。我究竟做错了什么?

预先非常感谢您。


Fortran 并不真正处理指针数组。您的声明

type(tSmall), pointer       :: var_small(:)

没有定义var_small是指向某种类型的指针的数组tsmall;相反,它将它定义为指向类型的数组的指针tsmall.

当我编译你的代码时,Intel Fortran 给出了更有用的错误消息

此数据指针分配的语法不正确:要么 'bound 在这种情况下,需要使用“spec”或“绑定重新映射”。

这将我们带到 Fortran 2003 标准中的 R735。编译器尝试解析var_small(1)不是如您所愿,作为对指针数组中第一个元素的引用,而是对边界规范列表 or a 边界重映射列表。该表达式没有正确的语法,因此解析失败。

这就解决了错误意味着什么的问题。你对此有何反应?这取决于你的意图。通常的建议是定义一个派生类型,沿着这些思路

type myptr
    type(tsmall), pointer :: psmall
end type myptr

然后使用这些数组

type(myptr), dimension(:), allocatable :: ptrarray

就我个人而言,我从来不喜欢这种方法,也从来不需要使用它(我编写非常简单的程序)。我希望 Fortran 2003 也有更好的方法,但在不知道您的意图的情况下,我犹豫是否提供建议。

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

Fortran 结构体指针 的相关文章

  • Fortran PURE 函数可以使用全局参数吗?

    在我看来 Fortran 中所谓的纯函数对于那些使用函数式编程的人来说似乎不够纯粹 这是我的问题 假设我有以下代码 MODULE basics IMPLICIT NONE INTEGER PARAMETER dp kind 1 0d0 RE
  • FORTRAN 写()

    在开始之前 我必须先声明一下 我是 FORTRAN 的新手 我正在维护 1978 年的一段遗留代码 它的目的是从文件中读取一些数据值 处理这些值 然后将处理后的值输出到另一个文本文件 给出以下 FORTRAN 代码 INTEGER NM S
  • 如何在 Fortran 90 中迭代包含数字、单词和空格的字符串?

    文件说明 STL文件由以下部分组成 solid
  • 如何将mortran代码转换为fortran代码

    我有一些 Mortran 代码 来自 glmnet 我想阅读和编译 我知道在编译时 Mortran首先转换为Fortran 然后编译 如果有预处理器的话 如何安装 Mortran 预处理器 特别是 OS X 上的 Mortran3 我在以下
  • Fortran 在 gdb 中打印可分配数组

    我正在向开源科学代码添加一些功能 我使用很多可分配项 但在正确打印它们时遇到一些问题 例如 我声明并分配 然后使用 real dp allocatable psi n phi some other stuff here allocate p
  • 使用 MacLaurin 展开的 Fortran Sine 函数的微小差异

    我正在用 Fortran 创建一个程序 它接受以弧度表示的 sin x 的 x 然后是要计算的项数 这是我的程序 Sine value using MacLaurin series program SineApprox implicit n
  • Fortran 递归分段错误

    我必须设计并实现一个 Fortran 例程来确定方格上簇的大小 并且递归地编写子例程似乎非常方便 然而 每当我的晶格大小超过某个值 大约 200 边 时 子例程就会始终出现段错误 这是我的集群检测例程 RECURSIVE SUBROUTIN
  • Fortran 内部计时例程,哪个更好? cpu_time 或 system_clock

    当对 FORTRAN 程序进行计时时 我通常只使用命令call cpu time t 然后我偶然发现call system clock count count rate count max 这似乎做了同样的事情 然而 在更加困难的庄园里 我
  • 带有过程参数的通用类型绑定过程

    我正在尝试编写一个通用的类型绑定过程 它将不同的回调函数作为参数 当编译以下代码 使用 ifort 12 1 3 时 我收到以下警告 module test type a type contains procedure t s gt at
  • Fortran90 中 BLAS 函数返回零

    我正在学习在Fortran90中使用BLAS 并使用子例程编写了一个简单的程序SAXPY https software intel com en us mkl developer reference fortran axpy和函数SNRM2
  • 如何在fortran 90中生成[0,5]范围内的整数随机数?

    我对 Fortran 编程有点陌生 任何人都可以帮我解决问题吗 我在生成整数随机数时遇到问题 在 Fortran 随机数范围 0 5 中使用 random seed 和 rand 为了支持answer https stackoverflow
  • 将结构化数据类型从 Fortran 传递到 C++ [重复]

    这个问题在这里已经有答案了 我在 Fortran 中有一个结构化类型 其中包含大量数据 包括指针 real 8 指针数据类型 我正在为某些 Fortran 例程开发 C API 我需要在对 Fortran 例程的调用之间保留该结构的内容 我
  • 将 FORTRAN 对象传递给 C,反之亦然

    我有我的 Fortran 对象 即 this object a this object b this object c 我想将它传递给用 C 编写的代码 我主要是一名 FORTRAN 程序员 而且我很少接触 C 我正在使用iso c bin
  • 如何从 Fortran 调用 R 函数?

    根据http gallery rcpp org articles r function from c http gallery rcpp org articles r function from c Rcpp 允许用户从 C 调用 R 函数
  • Fortran 指针数组

    同样 Fortran 中的指针数组 好吧 我有一个派生类型 type t context pointer type t context pointer p ctx end type t context pointer 当我在主程序中执行以下
  • Fortran 子例程返回错误值

    嘿 我正在开发一个 Fortran 程序 遇到了一个奇怪的问题 当我尝试在调用特定子例程之前直接输出数组的某些值时 我得到了正确的值 然后 我尝试在启动子例程时输出同一数组的一些值 它们都是 0 我最终在子例程之后输出数组的值 并且这些值回
  • Fortran 中的函数和子例程有什么区别?

    我的印象是 Fortran 中子例程和函数之间的主要区别在于函数返回值 而子例程更改作为参数传递的部分或全部值 但后来我了解到您也可以修改作为参数传递给函数的变量 我很困惑 找不到很好的参考来了解它们之间的差异 那么 这两种结构之间有什么区
  • 向具有 TARGET 属性的虚拟参数的过程提供不具有 TARGET 属性的参数

    在 Fortran 语言中 向具有 TARGET 属性的虚拟参数的过程提供不具有 TARGET 属性的参数应该会导致无效代码 但是 当使用 gfortran 5 1 0 或 ifort 14 0 0 编译以下代码时 不会检测到错误 并且程序
  • 如何在 Fortran 中实现数组结构而不是结构数组?

    我正在使用 Fortran 编写有关 CFD 主题的代码 在与一些计算机科学领域的朋友讨论后 他们告诉我 如果在他 她的代码中实现数组结构 SoA 而不是结构数组 AoS 可以加快计算时间 我见过很多关于这个主题的实现的例子 但大多数都是用
  • & 位于第 5 列和行尾

    我今天遇到一些代码 如下所示 subroutine sub hello world this routine takes a crazy large number of arguments so many that it gets spli

随机推荐

  • 根据屏幕尺寸替换 HTML

    我试图在小屏幕尺寸下替换 HTML 内容 然后在窗口再次变大时替换它 我下面的代码可以工作 但是我如何让它删除更改 到目前为止 这是我的代码 window resize function if window innerWidth lt 48
  • IOCP 文档解释问题 - 缓冲区所有权歧义

    因为我不是以英语为母语的人 所以我可能会错过一些东西 所以也许这里有人比我更了解 取自WSASendMSDN 上的文档 lpBuffers 输入 指向 WSABUF 数组的指针 结构 每个WSABUF结构 包含一个指向缓冲区的指针和 缓冲区
  • Visual Studio - SharePoint 2010 - 包括程序集 > 快速问题

    我有一个简单的问题 构建 VS 2010 SharePoint 项目 并且我正在引用自定义程序集 我可以在我的代码中引用这个程序集 并且编写代码和所有内容都可以正常工作 当我将项目部署到 SharePoint 时 我的功能激活代码将不会运行
  • 在数据步骤中表达“PUT所有变量”以导出SAS数据

    目标 使用数据步骤将整个 SAS 数据集导出到制表符分隔的文本文件 问题 在我能找到的每个例子中 例如this one 必须指定 PUT 语句后面的数据步骤中的每个变量 难道没有一种简单的方法来只要求 所有 变量吗 我已经尝试过使用PUT
  • 将上传的文件作为电子邮件附件发送

    我是网页设计的新手 我需要用 HTML 创建一个表单 要求用户输入多个字段并上传他 她的简历 当他提交表格时 他的提交内容应该通过电子邮件发送给我 并附上他的简历作为电子邮件的附件 我使用 PHP 来发送电子邮件 一切正常 除了文件未附加到
  • 无法访问 XCTestCase 对象中的 AppDelegate(或引用它的任何内容)

    我正在尝试在我的 swift iOS 应用程序上开始单元测试 但遇到了完全的障碍 我似乎无法访问任何使用我的 appDelegate 的内容 我的 appDelegate 有一个UserController存储和管理登录用户及其各种数据的对
  • 用音频录制点击的按钮

    我正在创造一种乐器 我希望录制按钮可以录制音频和点击的内容 但是当我点击录制按钮时 它只录制音频 我想录制音频以及用户点击的内容 这是我的记录代码 public void startRecord throws Exception recor
  • 使用 sed 引用特殊字符

    我试图查看传递给我的程序的变量 变量是 1 并用所述特殊字符的引号形式替换任何特殊字符 以免特殊字符实际上执行通常的操作 我的代码是 bin sh target 1 newtarget echo target sed e s g newta
  • “数组/指针等效”的现代术语是什么?

    几乎每个阅读本文的人都可能熟悉有关 C 的以下三个关键事实 当您在表达式中提及数组的名称时 它 大多数情况下 计算结果为指向数组第一个元素的指针 数组下标 运算符 对于指针和数组来说同样有效 看似数组的函数参数实际上声明了一个指针 这三个事
  • 如何获取用户数据中的 AWS 实例标签?

    我将 aws ec2 userdata 与 windows powershell 脚本结合使用 我需要实例引导 我的想法是 EC2实例标签添加 它的键名称 Version 它的值 1 0 0 158 branchname 我尝试获取用户数据
  • 如何使用PHP和SQL Server 2008调用存储过程

    我正在使用 SQL Server 2008 和 PHP 我想在 PHP 中调用存储过程 请指导我 Regards read mssql execute conn mssql connect host user pass mssql sele
  • 是否可以在 C# 中使用 Microsoft 的脱机文件 API?

    我正在尝试弄清楚如何使用离线文件API来自 C 如果可能 我相信 如果 API 是 COM API 那么理论上我应该能够使用以下方法从 C 调用它here 不幸的是 我不知道它是否是 COM API 也不知道如何判断 作为一个更一般的旁注
  • 手动优化嵌套循环

    我正在做一项家庭作业 我必须手动优化嵌套循环 我的程序将在禁用优化的情况下编译 作业的目标是在 6 秒内运行整个程序 少于 4 5 秒的加分 我只允许更改一小块代码 起点是这样的 for j 0 j lt ARRAY SIZE j sum
  • Scala REPL“错误:值>不是类型参数T的成员”

    这是我的文件 trait Set T def contains x T Boolean def incl x T Set T def union that Set T Set T class Empty T extends Set T ov
  • 如何在Monodroid中使用dropnet、sharp box等库

    我已经在图像上传器上创建了一个桌面应用程序 现在我想使用 Monodroid 将其移植到 Android 应用程序将图像上传到保管箱 在桌面版本中 我使用了 dropnet 它引用了 sharpbox Json 等 有什么方法可以在我的 m
  • 如何让ANTLR消耗所有可见元素?

    这是我的语法 grammar test text foo EOF foo X foo foo foo tail tail foo 我正在解析这段文字 X X X X 这是我得到的树 语法应该改变什么才能让我只得到一个tail包含所有元素的集
  • C 使用 scanf() 进行 |分隔字符串

    我想输入一些字符串然后两个整数 字符串由 分隔 而整数则由 分隔 在网上浏览时我看到了某种语法 其中涉及 我正在使用这个 但它根本不起作用 有人可以指出我应该做什么以及为什么我所做的事情是错误的吗 sscanf str s s s i i
  • 将 SXSSF 保存为 .xls 文件

    我正在使用 Apache POI 库将大量数据导入 Excel 文件 我不能使用 HSSF 模型 因为它需要太多内存并且 Java 会抛出内存堆异常 我发现的方法是 SXSSF 工作簿模型 它将每 N 行写入文件 而不是将所有工作簿存储在内
  • oracle如何在没有UNION的情况下将列转置为行

    假设我的表中有 4 列 id col1 col2 col3 现在我想将其转置为一列但分为 4 行 result someid col1data col2data col3data 我怎样才能做到这一点 谢谢 这可以使用以下方法完成unpiv
  • Fortran 结构体指针

    我在将一个指向结构的指针分配给一个指向结构的指针时遇到问题 我使用 gfortran 4 6 3 文件名是 test pointer struct f08 因此我使用 Fortran 2008 标准 由 gfortran 4 6 3 支持