外部函数需要定义使用。 real :: random_number 后面加一个 ran2 就行了。 也就是: real :: random_number , ran2 此外,语法提供对随机数的支持,如下代码即可: 详解:http://random.w.fcode.cn/ [Fortran] 纯文本查看 复制代码 program main implicit none real :: rnd call random_seed()! 初始化随机数种子 ! 调用ran2函数获取随机数 call random_number(rnd) print *, "生成的随机数为:", rnd end program main |
watson 发表于 2024-11-19 00:23 显示这两个错误 Compilation Aborted (code 1) error #6404: This name does not have a type, and must have an explicit type. [RAN2] |
fcode 发表于 2024-11-15 17:16 [Fortran] 纯文本查看 复制代码 program main implicit none integer :: idum real :: random_number ! 初始化随机数种子,这里可自行设置合适的整数值 idum = 1234 ! 调用ran2函数获取随机数 random_number = ran2(idum) print *, "生成的随机数为:", random_number end program main FUNCTION ran2(idum) INTEGER idum, IM1, IM2, IMM1, IA1, IA2, IQ1, IQ2, IR1, IR2, NTAB, NDIV REAL ran2, AM, EPS, RNMX PARAMETER (IM1=2147483563,IM2=2147483399,AM=1./IM1, IMM1=IM1-1,IA1=40014,IA2=40692,IQ1=53668,IQ2=52774,IR1=12211, IR2=3791, NTAB=32,NDIV=1+IMM1/NTAB,EPS=1.2e-7,RNMX=1.-EPS) INTEGER idum2, j, k, iv(NTAB), iy SAVE iv, iy, idum2 DATA idum2/123456789/, iv/NTAB*0/,iy/0/ if (idum.le.0) then idum=max(-idum,1) idum2=idum do j=NTAB+8,1,-1 k=idum/IQ1 idum=IA1*(idum-k*IQ1)-k*IR1 if (idum.lt.0) idum=idum+IM1 if (j.le.NTAB) iv(j)=idum enddo iy=iv(1) endif k=idum/IQ1 idum=IA1*(idum-k*IQ1)-k*IR1 if (idum.lt.0 ) idum=idum+IM1 k=idum2/IQ2 idum2=IA2*(idum2-k*IQ2)-k*IR2 if (idum2.lt.0) idum2=idum2+IM2 j=1+iy/NDIV iy=iv(j)-idum2 iv(j)=idum if (iy.lt.1) iy=iy+IMM1 ran2=min(AM*iy, RNMX) return END 这样还是出错了,这个程序我跑不起来呀 |
你这个程序只有子程序,没有主程序,不能独立运行呢。看看输出窗口,应该有类似libifcoremdd.lib(for_main.obj) : error LNK2019: 无法解析的外部符号 _MAIN__,该符号在函数 _main 中被引用 这种错误提示,就是在告诉你找不到主程序。 |
在我这里去掉之后就正常了啊。 如果你改了之后错误提示有变化,请给出新的错误提示。(而不是简单的说“还是出错”) [Fortran] 纯文本查看 复制代码 FUNCTION ran2(idum) INTEGER idum, IM1, IM2, IMM1, IA1, IA2, IQ1, IQ2, IR1, IR2, NTAB, NDIV REAL ran2, AM, EPS, RNMX PARAMETER (IM1=2147483563,IM2=2147483399,AM=1./IM1, IMM1=IM1-1, & IA1=40014,IA2=40692,IQ1=53668,IQ2=52774,IR1=12211, & IR2=3791, NTAB=32,NDIV=1+IMM1/NTAB,EPS=1.2e-7,RNMX=1.-EPS) INTEGER idum2, j, k, iv(NTAB), iy SAVE iv, iy, idum2 DATA idum2/123456789/, iv/NTAB*0/,iy/0/ if (idum.le.0) then idum=max(-idum,1) idum2=idum do j=NTAB+8,1,-1 k=idum/IQ1 idum=IA1*(idum-k*IQ1)-k*IR1 if (idum.lt.0) idum=idum+IM1 if (j.le.NTAB) iv(j)=idum enddo iy=iv(1) endif k=idum/IQ1 idum=IA1*(idum-k*IQ1)-k*IR1 if (idum.lt.0 ) idum=idum+IM1 k=idum2/IQ2 idum2=IA2*(idum2-k*IQ2)-k*IR2 if (idum2.lt.0) idum2=idum2+IM2 j=1+iy/NDIV iy=iv(j)-idum2 iv(j)=idum if (iy.lt.1) iy=iy+IMM1 ran2=min(AM*iy, RNMX) return END |
1.png (211.33 KB, 下载次数: 35)
watson 发表于 2024-11-15 14:41 [Fortran] 纯文本查看 复制代码 FUNCTION ran2(idum) INTEGER idum, IM1, IM2, IMM1, IA1, IA2, IQ1, IQ2, IR1, IR2, NTAB, NDIV REAL ran2, AM, EPS, RNMX PARAMETER (IM1=2147483563,IM2=2147483399,AM=1./IM1, IMM1=IM1-1, & IA1=40014,IA2=40692,IQ1=53668,IQ2=52774,IR1=12211, & IR2=3791, NTAB=32,NDIV=1+IMM1/NTAB,EPS=1.2e-7,RNMX=1.-EPS) INTEGER idum2, j, k, iv(NTAB), iy SAVE iv, iy, idum2 DATA idum2/123456789/, iv/NTAB*0/,iy/0/ if (idum.le.0) then idum=max(-idum,1) idum2=idum do 11 j=NTAB+8,1,-1 k=idum/IQ1 idum=IA1*(idum-k*IQ1)-k*IR1 if (idum.lt.0) idum=idum+IM1 if (j.le.NTAB) iv(j)=idum enddo 11 iy=iv(1) endif k=idum/IQ1 idum=IA1*(idum-k*IQ1)-k*IR1 if (idum.lt.0 ) idum=idum+IM1 k=idum2/IQ2 idum2=IA2*(idum2-k*IQ2)-k*IR2 if (idum2.lt.0) idum2=idum2+IM2 j=1+iy/NDIV iy=iv(j)-idum2 iv(j)=idum if (iy.lt.1) iy=iy+IMM1 ran2=min(AM*iy, RNMX) return END |
fcode 发表于 2024-11-15 08:19 试过了还是出错 |
代码最好是复制粘贴,发在帖子里,而不要截图。 尝试把 do 11 后面的 11 删掉。enddo 11 后面的11删掉。 |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2024-12-23 04:00