24小时热门版块排行榜    

查看: 2221  |  回复: 8

li_clifff

银虫 (正式写手)

[求助] 请教一个read的用法,谢谢

请教一个问题,我要搞清楚程序中这两个语句的结果:

INTEGER:: k, nr,i, nodof=3,nn=96
INTEGER,ALLOCATABLE:: nf(:, : )
ALLOCATE nf(nodof,nn)
READ(10,*)nr,(k,nf(:,k),i=1,nr)

其中文件10为:
81
1 1 0 0   2 1 0 0   3 1 1 0   4 1 0 0   5 1 1 0   6 1 0 0
7 1 1 0   8 1 0 0   9 1 1 0  10 1 0 0  11 1 1 0  12 0 0 0
13 1 0 1  14 1 0 1  15 1 0 1  16 1 0 1  17 0 0 0  18 0 1 0
19 1 0 1  21 1 0 1  23 1 0 1  25 1 0 1  27 1 0 1  28 0 1 0
29 0 0 0  30 1 0 1  31 1 0 1  32 1 0 1  33 1 0 1  34 0 0 0
35 0 1 0  36 1 0 1  38 1 0 1  40 1 0 1  42 1 0 1  44 1 0 1
45 0 1 0  46 0 0 0  47 1 0 1  48 1 0 1  49 1 0 1  50 1 0 1
51 0 0 0  52 0 1 0  53 1 0 1  54 1 1 1  55 1 0 1  57 1 0 1
59 1 0 1  61 1 0 1  62 0 1 0  63 0 0 0  64 1 0 1  65 1 0 1
66 1 0 1  67 1 0 1  68 0 0 0  69 0 1 0  70 1 0 1  72 1 0 1
74 1 0 1  76 1 0 1  78 1 0 1  79 0 1 0  80 0 0 0  81 1 0 1
82 1 0 1  83 1 0 1  84 1 0 1  85 0 0 0  86 0 1 0  87 0 0 0
88 0 1 0  89 0 0 0  90 0 1 0  91 0 0 0  92 0 1 0  93 0 0 0
94 0 1 0  95 0 0 0  96 0 1 0
在debug模式下,nr值为81,k为96(?),nf是3*96的数组,i等于82(?)

能帮我解释下为什么会这样吗?非常感谢
其中nf数组前面几个值为:




[ Last edited by li_clifff on 2011-10-15 at 00:57 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mchen10

金虫 (正式写手)

★ ★
余泽成(金币+2): 谢谢参与应助,欢迎常来程序语言版! 2011-10-15 19:13:10
ben_ladeng: 专家考核存档 2011-10-17 11:51:35
读入第一个数据, 为nr (number of rows?)
然后 4个一组地读入 到k, nf(1,k), nf(2,k), nf(3,k); 一共读 nr次
更痛苦的是梦没醒路已经不能走了
2楼2011-10-15 03:08:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

★ ★
余泽成(金币+2): 谢谢参与应助! 2011-10-15 19:13:21
li_clifff(金币+10): 恩,明白了,谢谢 2011-10-15 23:22:40
ben_ladeng: 专家考核存档 2011-10-17 11:51:44
ALLOCATE nf(nodof,nn) 这句话是错误的吧?
ALLOCATE(nf(nodof,nn))
如果在这之后加一句:
nf = 100000
然后在程序结束之前加上:
CODE:
do i=1,96
   write(*,*) nf(1:3,i)
end do

你就知道你的程序是在做什么了……
3楼2011-10-15 14:30:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

li_clifff

银虫 (正式写手)

引用回帖:
3楼: Originally posted by snoopyzhao at 2011-10-15 14:30:40:
ALLOCATE nf(nodof,nn) 这句话是错误的吧?
ALLOCATE(nf(nodof,nn))
如果在这之后加一句:
nf = 100000
然后在程序结束之前加上:
CODE:
do i=1,96
   write(*,*) nf(1:3,i)
end do

你就知道你 ...

恩,再请教一个小问题,如果在主程序里定义了变量数组nf是3*9的,即nf(3,9),而且主程序里的 call subroutine(nf,...),对应的subroutine里面对nf定义为nf(2,9),会有什么问题吗?运行时候到底是nf(3,9),还是nf(2,9),刚想到有这个问题,就顺便问一下,谢谢
4楼2011-10-15 23:26:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

引用回帖:
4楼: Originally posted by li_clifff at 2011-10-15 23:26:37:
恩,再请教一个小问题,如果在主程序里定义了变量数组nf是3*9的,即nf(3,9),而且主程序里的 call subroutine(nf,...),对应的subroutine里面对nf定义为nf(2,9),会有什么问题吗?运行时候到底是nf(3,9) ...

你确定你这种做法可以编译通过吗?呵呵……

如果可以的话,给个示例看看……
5楼2011-10-16 13:01:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

li_clifff

银虫 (正式写手)

引用回帖:
5楼: Originally posted by snoopyzhao at 2011-10-16 13:01:30:
你确定你这种做法可以编译通过吗?呵呵……

如果可以的话,给个示例看看……

program  ex0804
implicit none
  integer :: a(2)
  DATA  a /1,2/
  integer :: b(2)
  data b  /2,3/
  call add(a,b)  ! 把变量a及b交给子程序add来处理
  stop
end


subroutine add(first, second)
implicit none
  integer :: first, second ! first,second的内容会从CALL时得到
  write(*,*) first+second
  return
end
6楼2011-10-16 22:51:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖


jjdg(金币+1): 感谢参与 2011-10-17 02:32:35
li_clifff(金币+10): 谢谢你的评论,如果数组参数在主程序和多个子程序都出现,是不是也是这样一步步传递,读入子程序,运行子程序出来新的数组,再读入下一个子程序。。。 2011-10-17 09:44:20
引用回帖:
6楼: Originally posted by li_clifff at 2011-10-16 22:51:30:
program  ex0804
implicit none
  integer :: a(2)
  DATA  a /1,2/
  integer :: b(2)
  data b  /2,3/
  call add(a,b)  ! 把变量a及b交给子程序add来处理
  stop
end


subroutine add(first, se ...

由于 Fortran 是 call by reference,所以,关键还是要看子程中相关变理的声明了……

在你的这个例子中,很显然,只取其中的一个数值。

对于你前面说的,其实,传递给子程的只是数组对应的第一个数值的地址,后面到底如何取值,还要看子程中的定义……这种情况下,一定要注意 Fortran 中是列优先的存贮方式……

» 本帖已获得的红花(最新10朵)

7楼2011-10-17 00:11:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

li_clifff

银虫 (正式写手)

送鲜花一朵
引用回帖:
7楼: Originally posted by snoopyzhao at 2011-10-17 00:11:07:
由于 Fortran 是 call by reference,所以,关键还是要看子程中相关变理的声明了……

在你的这个例子中,很显然,只取其中的一个数值。

对于你前面说的,其实,传递给子程的只是数组对应的第一个数值的地址 ...

program  ex0804
implicit none
integer :: a(3)
DATA  a /1,2,3/
integer :: b(3)
data b  /4,5,6/
call add(a,b)  ! 把变量a及b交给子程序add来处理
call add1(a,b)

  stop
end

subroutine add(first, second)
implicit none
  integer :: first(2), second(2) ! first,second的内容会从CALL时得到
  write(*,*) first+second
  return
end

subroutine add1(first, second)
implicit none
  integer :: first, second ! first,second的内容会从CALL时得到
  write(*,*) first+second
  return
end

为什么运行的结果是
     5      7
     5
8楼2011-10-17 09:59:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

li_clifff

银虫 (正式写手)

没有问题,我自己弄错了

program  ex0804
implicit none
!integer:: a=1
integer :: a(3)
DATA  a /1,2,3/
!integer:: b=2
integer :: b(3)
data b  /4,5,6/
call add(a,b)  ! 把变量a及b交给子程序add来处理
call add1(a,b)

stop
end


subroutine add(first, second)
implicit none
  integer :: first(2), second(2) ! first,second的内容会从CALL时得到
! write(*,*)  first+second
  first = first + second
  second =2*second
  return
end


subroutine add1(first, second)
implicit none
  integer :: first(2), second(2) ! first,second的内容会从CALL时得到
  write(*,*) first+second
  return
end

运行结果是

       13               17
9楼2011-10-17 10:36:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 li_clifff 的主题更新
信息提示
请填处理意见