fortran常见问题解决
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
楼主为了减少重复回答问题,特编此帖,并不定期添加和更新内容。
错误难免,欢迎讨论,仅供参考。
很多人问哪里可以找到Fortran编译器,有不少热心学友提供网址,特汇集在这里。虽然俺检验过这些链接,但是它们不一定总有效。
Fortran编译器下载:
CVF?
FTN95(License:Freeforpersonaluse)
以下操作,如无特别说明,都是以为例。
1.如何加大Stacksize?
选Project=>Settings=>Link=>Category:Output=>?
Stackallocations
Reserve:这里填新值(默认为1M,若需要10M,则填)
2.如何用Fortran批量生成文件?
设要生成4000个文件,文件名为AA1-AA4000,如何写循环生成文件,而不用写4000次write 命令呢?
用内部文件:
character(len=80)::filename,form
integer::i
doi=1,4000
selectcase(i)
case(1:9)
write(form,'(i1)')i
case(10:99)
write(form,'(i2)')i
case(100:999)
write(form,'(i3)')i
case(1000:9999)
write(form,'(i4)')i
endselect
write(filename,*)"AA",trim(form),".TXT"
open(10,file=filename)
write(10,*)i
close(10)
enddo?
stop
end
3.如何用Fortran动态生成输出格式?
设有一个数组data(100),输出时,希望每行输出num个数,而num由用户输入,如何实现?
用内部文件:
character(len=80)::form
real::data(100)
integer::i,num
data=(/(i,i=1,100)/)/
read(*,*)num
write(form,*)"(",num,""
write(*,form)data
stop
end
4.MS是不是很垃圾?
是垃圾,其中Bug太多,多到不可用的地步!
在这个主题里,换了CVF后问题就没了的人已有相当的数目。
如果你用,遇到莫名其妙的错误,建议换,这是一个比较成熟的编译器。
5.如何用F90/95生成随机数?
注意:
现在计算机产生的随机数都是伪随机数。
random_number(x)产生一个0到1之间的随机数(x可以是向量),但是每次总是那几个数。用了random_seed()后,系统根据日期和时间随机地提供种子,使得随机数更随机了。
programrandom
implicitnone
real::x
callrandom_seed()!系统根据日期和时间随机地提供种子
callrandom_number(x)!每次的随机数就都不一样了
write(*,*)x
stop
endprogramrandom
6.函数/子程序超载的例子
设要编一个两个变量值互换的子程序swap(a,b),哑元a,b可能是实型数,整型数,数组,矩阵,字符串,派生类型等等。但是希望只用一个子程序接口swap(a,b)来实现。F90可以用类属接口来实现这种子程序超载:
moduleUtilities
implicitnone
privateI_Swap,R_Swap,RVec_Swap,RMat_Swap,Type_Swap
public::Swap
interfaceSwap
moduleprocedureI_Swap,R_Swap,RVec_Swap,RMat_Swap,Type_Swap
endinterface
contains
subroutinei_swap(a,b)!整型置换
integer(ikind),intent(inout)::a,b
integer(ikind)::t
。。。!略
endsubroutinei_swap
subroutiner_swap(a,b)!实型置换
real(rkind),intent(inout)::a,b
real(rkind)::t
t=a
a=b
b=t
return
endsubroutiner_swap
subroutineRVec_swap(a,b)!实型向量置换
real(rkind),intent(inout)::a(:),b(:)
integer(ikind)::i
doi=1,size(a)
callR_Swap(a(i),b(i))
enddo
return
endsubroutineRVec_swap
subroutineRMat_swap(a,b)!实型矩阵置换
。。。!略
endsubroutineRMat_swap
subroutineType_swap(a,b)!派生类型置换