Fortran Coder

查看: 846|回复: 10

[讨论] VB中Redim功能讨论

[复制链接]

60

帖子

14

主题

1

精华

专家

F 币
572 元
贡献
351 点
发表于 2018-8-3 13:39:06 | 显示全部楼层 |阅读模式
比如Redim Preserve比Fortran的
allocate功能强大,能保存数组之前的元素数值
Fortran如何实现类似功能?
链表?


回复

使用道具 举报

485

帖子

4

主题

0

精华

大宗师

F 币
3258 元
贡献
1926 点

水王勋章元老勋章热心勋章

发表于 2018-8-3 13:53:59 | 显示全部楼层
对标C的realloc?
https://en.cppreference.com/w/c/memory/realloc
fortran当然有这项功能
https://docs.oracle.com/cd/E19205-01/819-5259/aetga/index.html
1.4.35 malloc, malloc64, realloc, free: Allocate/Reallocate/Deallocate Memory

1418

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
700 元
贡献
531 点

新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2018-8-3 18:38:38 | 显示全部楼层
realloc 是 Sun 提供的函数,不是标准的。
不管是VB的 Redim Preserve,还是 C++ 容器类的 resize() 成员。其底层的实现本质,都是重新分配,然后复制原来的值。

Fortran需要自己去实现,而且由于Fortran没有模板类,所以每种类型都要写一遍,二维数组又要写一遍,三维还要写一遍。实际上,C++ 压根没有多维数组,VB Redim Preserve 也只能改变最后一维的大小,前面不能改变。
静态编程语言,改变大小都很难。想要自由编程,可以选 Python 或者 matlab 这种动态编程语言。想怎么加怎么加。

用预处理宏定义可以节省一点时间。

[Fortran] 纯文本查看 复制代码
Program Main
  Integer , allocatable :: x(:)
  Real    , allocatable :: y(:)
  allocate(x(4),y(4))
  x = 3 ; y = 4
  write(*,*) x
  write(*,*) y
  call ReallocateInt( x , 3 )
  call ReallocateReal( y , 6 )
  write(*,*) x
  write(*,*) y
  
contains
#define TYPE_  Integer  
  Subroutine ReallocateInt( x , n )
    TYPE_ , allocatable :: x(:) , t(:)
    integer :: n , s
    call move_alloc(x,t)
    allocate(x(n))
    s = min(size(t),n)
    x(:s) = t(:s)
    deallocate(t)
  End Subroutine ReallocateInt
#define TYPE_  Real  
  Subroutine ReallocateReal( x , n )
    TYPE_ , allocatable :: x(:) , t(:)
    integer :: n , s
    call move_alloc(x,t)
    allocate(x(n))
    s = min(size(t),n)
    x(:s) = t(:s)
    deallocate(t)
  End Subroutine ReallocateReal
  
End Program Main

60

帖子

14

主题

1

精华

专家

F 币
572 元
贡献
351 点
 楼主| 发表于 2018-8-3 19:25:49 | 显示全部楼层
曲线解决
运行时不确定数组元素个数
用Redim Preserve很方便的

60

帖子

14

主题

1

精华

专家

F 币
572 元
贡献
351 点
 楼主| 发表于 2018-8-24 12:39:18 | 显示全部楼层
无限多态class(*)都无法实现模板?

485

帖子

4

主题

0

精华

大宗师

F 币
3258 元
贡献
1926 点

水王勋章元老勋章热心勋章

发表于 2018-8-24 15:28:26 | 显示全部楼层
weixing1531 发表于 2018-8-24 12:39
无限多态class(*)都无法实现模板?

这个问题很有意思,特地费点时间去查找了一下
简易模板
https://stackoverflow.com/questions/23706742/template-in-fortran
模板类库
https://github.com/robertrueger/ftl

60

帖子

14

主题

1

精华

专家

F 币
572 元
贡献
351 点
 楼主| 发表于 2018-9-19 13:16:29 | 显示全部楼层
pasuka 发表于 2018-8-24 15:28
这个问题很有意思,特地费点时间去查找了一下
简易模板
https://stackoverflow.com/questions/23706742/t ...

看了源代码,作者几乎实现了STL所有功能
但是通过预处理实现的
模板类型T好象需要在预处理中修改

60

帖子

14

主题

1

精华

专家

F 币
572 元
贡献
351 点
 楼主| 发表于 2019-5-8 01:54:33 来自移动端 | 显示全部楼层
本帖最后由 weixing1531 于 2019-5-8 02:09 编辑

f2008好像可以直接实现
program main
  integer, parameter   :: ivp(*) = [1,2,3,4,5]
  integer, allocatable :: iv(:)
  integer :: i, ios, unit
  iv = [integer ::]
  open(newunit = unit, file='test.txt')
  do
    read(unit=unit,fmt=*,iostat=ios) i
    if(ios /= 0) exit
    iv = [iv,i]
  enddo
  close(unit)
  if(all(iv==ivp)) print*, 'pass'
end program

699

帖子

0

主题

0

精华

大师

F 币
698 元
贡献
389 点

规矩勋章元老勋章新人勋章水王勋章

QQ
发表于 2019-5-8 08:30:59 | 显示全部楼层
嗯,递延数组。F2008新增的功能,但是能不用尽量不用,特别是大数组,重新分配的资源消耗还是很头疼的。

60

帖子

14

主题

1

精华

专家

F 币
572 元
贡献
351 点
 楼主| 发表于 2019-5-8 18:31:27 | 显示全部楼层
vvt 发表于 2019-5-8 08:30
嗯,递延数组。F2008新增的功能,但是能不用尽量不用,特别是大数组,重新分配的资源消耗还是很头疼的。 ...

试验了一下
递延数组在超大数组方面果然效率太差
比链表差多了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2019-8-21 13:51

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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