Fortran Coder

查看: 5302|回复: 12
打印 上一主题 下一主题

[指针] Type 包含 allocatable 数组

[复制链接]

43

帖子

13

主题

0

精华

专家

F 币
435 元
贡献
155 点
跳转到指定楼层
楼主
发表于 2023-3-25 02:04:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
可分配数组中的元素是type类型,而元素中又包含可分配数组,该怎么解决呢?
[Fortran] 纯文本查看 复制代码
    type mytype
        sequence
        integer,dimension(:),allocatable:: array_type
        integer,dimension(10):: other_variables
    end type
    
    type(mytype),dimension(:),allocatable:: array_main
    
    allocate(array_main%array_type(10))
    
    allocate(array_type(10))

    end

提示错误:
Component to the right of a part reference with nonzero rank must not have the ALLOCATABLE attribute

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
13#
发表于 2023-3-27 08:30:40 | 只看该作者
抱歉,我对其他语言了解很少。
但是 C/C++ 也有同样的问题,如果包含指针(指向一个分配出来的数组),那么读取的是指针而不是指针指向的目标。
此外,C/C++的原生指针(非容器类),编译器并不存储指向目标数组的大小,所以更没法整体读取数组。

43

帖子

13

主题

0

精华

专家

F 币
435 元
贡献
155 点
12#
 楼主| 发表于 2023-3-27 00:19:56 | 只看该作者
kyra 发表于 2023-3-26 11:42
改成
read(fid_segy) traces(i)%header ,traces(i)%idata ! 读取前500道
就行了。

谢谢解答!
但感觉这样的特性好奇怪,不知道其它语言有没有这种限制。

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
11#
发表于 2023-3-26 15:14:57 | 只看该作者
风平老涡 发表于 2023-3-26 11:50
read语句不能直接读取type类变量。

不含可分配数组和指针的派生类型是可以直接整体读写的。

213

帖子

2

主题

0

精华

宗师

F 币
2131 元
贡献
875 点

规矩勋章

10#
发表于 2023-3-26 11:50:25 | 只看该作者
本帖最后由 风平老涡 于 2023-3-26 11:53 编辑
愤怒的三炮 发表于 2023-3-26 01:48
我想用这个派生类型数组去读取SEGY文件,但是提示错误
[mw_shl_code=fortran,true]type trace
      seque ...

read语句不能直接读取type类变量。


do i = 1, 500
  read(fid_segy) traces(i) % header, (traces(i) % idata(j), j = 1, 6000)
end do

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
9#
发表于 2023-3-26 11:42:18 | 只看该作者
改成
read(fid_segy) traces(i)%header ,traces(i)%idata ! 读取前500道
就行了。
带有可分配数组的 type,不能整体读写。

43

帖子

13

主题

0

精华

专家

F 币
435 元
贡献
155 点
8#
 楼主| 发表于 2023-3-26 01:48:57 | 只看该作者
本帖最后由 愤怒的三炮 于 2023-3-26 02:04 编辑
kyra 发表于 2023-3-25 08:00
根据我的习惯,做了一些修改。

我的有些习惯不是必须的,但我个人认为会让更清晰。

我想用这个派生类型数组去读取SEGY文件,但是提示错误
[Fortran] 纯文本查看 复制代码
type trace
      sequence
      type(segy_trace_head):: header
      real(4),dimension(:),allocatable:: idata
end type

type(segy_reel_head):: reel_head
type(trace),dimension(:),allocatable:: traces
integer:: fp,fid_segy,fid_traces
integer:: i
    
open(newunit=fid_segy,file='D:/Example.SEGY',form='unformatted',access='stream',convert='big_endian')
    
allocate(traces(500))
do i = 1,500
     allocate(traces(i)%idata(6000))
end do
    
read(fid_segy) reel_head
    
do i = 1, 500
       
     read(fid_segy) traces(i) ! 读取前500道
     
end do


Error: Data transfer element at (1) cannot have ALLOCATABLE components unless it is processed by a defined input/output procedure

出错位置在第23行,该怎么处理呢?

43

帖子

13

主题

0

精华

专家

F 币
435 元
贡献
155 点
7#
 楼主| 发表于 2023-3-25 22:59:54 | 只看该作者
weixing1531 发表于 2023-3-25 12:08
二维不等长数组的固定套路

是的,本质就是一个二维的不等长数组。

43

帖子

13

主题

0

精华

专家

F 币
435 元
贡献
155 点
6#
 楼主| 发表于 2023-3-25 22:57:36 | 只看该作者
kyra 发表于 2023-3-25 08:00
根据我的习惯,做了一些修改。

我的有些习惯不是必须的,但我个人认为会让更清晰。

很受用,谢谢!
我是想读地震记录的,想着先确定好每一道的数组大小(type里的数组元素),然后再分配总共有多少地震道。
看来计算机的逻辑并不是这样的。

43

帖子

13

主题

0

精华

专家

F 币
435 元
贡献
155 点
5#
 楼主| 发表于 2023-3-25 22:54:49 | 只看该作者
唐汉 发表于 2023-3-25 06:46
[mw_shl_code=fortran,true]program main

   implicit none

谢谢你!原来它需要先分配main里面的数组长度,然后再分配type里元素的长度,我顺序搞反了。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-23 13:39

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表