找回密码
 注册
Simdroid-非首页
查看: 459|回复: 18

[3. Fortran] 求助!如何将动态数组用在common公用区中?

[复制链接]
发表于 2005-4-9 22:33:35 | 显示全部楼层 |阅读模式 来自 陕西西安
我在"com.f90"声明了一个动态数组,com.f90 内容如下
real,allocatable::x(:)
common x
主程序如下:
program main
include "com.f90"
read*,i
allocate(x( i ))
do j=1,i
  x(j)=j+1
enddo
end

程序中报错:Error: Conflicting attributes or multiple declaration of name.   [X]
到底是什么缘故?
如果我想在公用区中存储动态数组改如何修改?
请各位高手不吝指点,谢过先!
发表于 2005-4-10 12:38:50 | 显示全部楼层 来自 江苏南京

Re:求助!如何将动态数组用在common公用区中?

Simdroid开发平台
动态数组不能放入公用区中。
建议:

  module com1
  real,allocatable::x(
  endmodule
  
  program main
  use com1
  read(*,*) i
  allocate(x(i))
  do j=1,i
  x(j)=j+1
  enddo
  write(*,*)x
  deallocate(x)
  end

评分

1

查看全部评分

 楼主| 发表于 2005-4-10 14:55:54 | 显示全部楼层 来自 陕西西安

Re:求助!如何将动态数组用在common公用区中?

但是如果我在其他子程序中调用x数组怎么办,如
subroutine  sub
use com1
real y
y=x(1)
print*,y
end
可以吗?
 楼主| 发表于 2005-4-10 22:07:00 | 显示全部楼层 来自 陕西西安

Re:求助!如何将动态数组用在common公用区中?

我想我可能没有说清楚,我是想定义一个上下界变化的数组,根据输入的参数分配单元,然后将该数组能被其他的子程序所调用,因为参数传递太麻烦了,每次都要写一大堆变量名,所以我就想利用公用区.希望大家帮我想出一个好的方法!
发表于 2005-4-11 13:31:30 | 显示全部楼层 来自 江苏南京

Re:求助!如何将动态数组用在common公用区中?

jinguangyang wrote:
但是如果我在其他子程序中调用x数组怎么办,如
subroutine  sub
use com1
real y
y=x(1)
print*,y
end
可以吗?

  可以,但要保证com1中的x没有被释放掉
发表于 2005-4-13 12:43:29 | 显示全部楼层 来自 大连理工大学

Re:求助!如何将动态数组用在common公用区中?

可以尝试用GWinston 的方法,module可以实现你想的,可以看看彭国伦的书,上面有介绍。
 楼主| 发表于 2005-4-17 11:49:59 | 显示全部楼层 来自 陕西西安

Re:求助!如何将动态数组用在common公用区中?

彭国伦的书我也看过,但是还是有问题,那就是我因为要用数组,在module中的common存放数组不能赋初值,不能用data语句,blockdata好像也不行。
发表于 2005-4-18 08:21:32 | 显示全部楼层 来自 江苏南京

Re:求助!如何将动态数组用在common公用区中?

有必要在module中用common吗?
发表于 2005-4-18 10:05:17 | 显示全部楼层 来自 日本

Re:求助!如何将动态数组用在common公用区中?

Try not using common anymore. It is an old style and hrad to maintenence. Module can do ALL the thing common do but give much better quality. For exampler, explicit interface is much less error-prone, you can include dynamic array in it etc.
 楼主| 发表于 2005-4-20 17:35:07 | 显示全部楼层 来自 陕西西安

Re:求助!如何将动态数组用在common公用区中?

那就请各位高手指点一下如何不用common而使用全局数据吧!最好附上一小段的例程。
发表于 2005-4-21 10:11:13 | 显示全部楼层 来自 江苏南京

Re:求助!如何将动态数组用在common公用区中?

module com1
  real,allocatable::x(
  endmodule
  
  program main
  use com1
  read(*,*) i
  allocate(x(i))
  call set(i)
  write(*,*)x
  deallocate(x)
  end

  subroutine set(i)
  use com1
  do j=1,i
  x(j)=j+1
  enddo
  end
 楼主| 发表于 2005-4-23 17:19:16 | 显示全部楼层 来自 陕西西安

Re:求助!如何将动态数组用在common公用区中?

太谢谢Gwinston了,我好好吸收一下吧。希望你仍关注这个帖子,如果有问题我还会继续在这里向你请教。!
 楼主| 发表于 2005-4-27 20:24:38 | 显示全部楼层 来自 陕西西安

Re:求助!如何将动态数组用在common公用区中?

谢谢,问题应该解决了吧,谢谢Gwinston,iwtry和hillyyuan。
发表于 2005-5-4 09:10:21 | 显示全部楼层 来自 河南郑州

Re:求助!如何将动态数组用在common公用区中?

不错,有学了点东西,谢谢了!
 楼主| 发表于 2005-5-6 23:03:06 | 显示全部楼层 来自 陕西西安

Re:求助!如何将动态数组用在common公用区中?

最后在补充一点,最好在公用区中加上save属性,彭国伦书上说这是一种严格的写法,只有这样,在模块中的数据才能成为公用数据,但不加也可以得出正确的运行结果,这应归功于编辑器的扩展属性吧。
这也算给这个帖子画一个句号吧。!
发表于 2005-5-7 22:04:02 | 显示全部楼层 来自 上海交通大学

Re:求助!如何将动态数组用在common公用区中?

GWinston wrote:
module com1
  real,allocatable::x(
  endmodule
  
  program main
  use com1
  read(*,*) i
  allocate(x(i))
  call set(i)
  write(*,*)x
  deallocate(x)
  end

  subroutine set(i)
  use com1
  do j=1,i
  x(j)=j+1
  enddo
  end

试过了,但是compile的时候一直没有输出编译后的结果,并且编译的进程一直在进行,在VF的环境中无法中断,搞不懂为何,请GWinston指教,谢谢!
发表于 2005-5-8 13:49:27 | 显示全部楼层 来自 江苏南京

Re:求助!如何将动态数组用在common公用区中?

我也编译过,没问题呀!我用比较老的POWERSTATION4.0
 楼主| 发表于 2005-5-8 15:47:48 | 显示全部楼层 来自 陕西西安

Re:求助!如何将动态数组用在common公用区中?

我把我的一个成功的运行程序传上来吧,基本就是按照GWinston所介绍的来写的。在程序中说明了对全局数据的声明,赋值和修改。我用的是CVF6.5。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2005-5-8 17:08:22 | 显示全部楼层 来自 上海交通大学

Re:求助!如何将动态数组用在common公用区中?

jinguangyang wrote:
我把我的一个成功的运行程序传上来吧,基本就是按照GWinston所介绍的来写的。在程序中说明了对全局数据的声明,赋值和修改。我用的是CVF6.5。
试了一下,成功!
非常感谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-2 01:28 , Processed in 0.065973 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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