fortran常见问题解决

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)!派生类型置换

相关文档
最新文档