VB中Redim功能讨论-Fortran语法讨论-专业Fortran论坛 -

Fortran Coder

查看: 39|回复: 3

[讨论] VB中Redim功能讨论

[复制链接]

8

帖子

3

主题

0

精华

入门

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


回复

使用道具 举报

449

帖子

3

主题

0

精华

大宗师

F 币
3020 元
贡献
1796 点

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

发表于 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

1257

帖子

12

主题

5

精华

论坛跑堂

Fcode跑堂伙计

F 币
269 元
贡献
53 点

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

发表于 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

8

帖子

3

主题

0

精华

入门

F 币
97 元
贡献
68 点
 楼主| 发表于 2018-8-3 19:25:49 | 显示全部楼层
曲线解决
运行时不确定数组元素个数
用Redim Preserve很方便的
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2018-8-16 18:49

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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