我正在寻找一个rpm或简单的安装说明,让f2c在我的redhat linux os上工作.我是linux新手,很难在google上找到类似这样的东西.
(目标是使用f2c将简单的fortran77文件转换为c,然后编译)
有人有什么建议吗?
我正在尝试在Fotran 77中工作,我发现需要基于树的数据结构.除了使用数组实现树之外,是否有任何方法可以构建具有指向其他节点的指针节点的树,根据大多数语言的标准实现?
这种野兽的文件很少,似乎没有任何标准的结构类型可以实现这一点.
思考?
我继承了大约400行非常古怪的Fortran 77代码,我试图逐步分析它,以便在我的脑海中清楚地表达出来.
无论如何,我有一个类似头文件(实际上是一个.h,但其中的代码是在fortran而不是C/C++中),其中有两个语句,称为getarg.h:
character*80 serie
integer ln
Run Code Online (Sandbox Code Playgroud)
然后我有另一个fortran文件(.f)调用getserie.h其中包含此代码:
subroutine getserie(serie, ln)
include 'getarg.h'
call getarg(1, serie)
ln = index(serie, ' ') - 1
return
end
Run Code Online (Sandbox Code Playgroud)
我的问题是:我可以call使用只有变量声明的外部文件吗?这样做有什么影响?
我正在使用传统的Fortran 77代码子例程,其中参数类型未在代码块的顶部声明.
这是一个显示子程序顶部的片段.
SUBROUTINE BPASS(F1,F2,F3,F4,SI,N,A,IERR)
REAL * 4 A( N ),FV( 4 )
Run Code Online (Sandbox Code Playgroud)
根据以上所述,我认为A是长度的数组N类型REAL *4,大小等于一个C float.或者,FV(4)是一个长度4与类型的数组REAL *4.
但是,F1,F2,F3,F4,SI,N,IERR如果未列出类型,有哪些类型?它似乎N应该是一个integer.
我需要知道类型,以便我可以从C++代码调用子例程.对于未声明的类型,是否存在Fortran约定?
我的子程序中有以下代码:
character x*256 ,y*80
common /foo/ x ,y(999)
Run Code Online (Sandbox Code Playgroud)
好吧,我实际上并没有写这个.所以我不明白这里的尺寸.是y一个999元素宽的80字符长字符串数组?
如果是这样,如何在没有公共块的情况下在Fortran 90中正确定义?
我从FORTRAN 77中编写的模型中看到了这个FORTRAN语句.我不知道这意味着什么.如果有人可以发光,会很高兴.
以下是代码的外观:
IF(NC)20,20,10
注意:NC是一个变量(我认为),后面的数字是标签语句(我认为).
我的问题是,上述陈述是什么意思?我理解通常在"IF"语句之后,括号中应该有一个参数,例如(a <20).但是,在这种情况下,括号中只有一个变量.
在 Fortran 中,可以为指针分配内存,或者不能:
real(kind=jp), target :: bt(100,100)
real(kind=jp), pointer :: pt(:,:)
Run Code Online (Sandbox Code Playgroud)
但是你可以为指针分配内存pt:
allocate(pt(100,100))
Run Code Online (Sandbox Code Playgroud)
我的问题是:利弊是什么?就我所见,为指针分配内存违背了指针的目的并占用了更多内存。当然,我对指针的了解是有限的,所以如果有人能向我解释这里发生了什么,我将不胜感激。
我正在使用混合 FORTRAN 77 和 Fortran 90 代码的模型,此外,我正在使用英特尔编译器编译代码。
我开始学习Fortran,来自C++/Matlab/Java背景.我意识到一些Fortran程序员仍然坚持使用F77,可能是因为他们不喜欢面向对象,命名空间和东西,并且习惯于旧的语法.
我知道你可以编写一个没有OOP的程序.我不明白的是没有动态内存管理你怎么做.有一千个例子,你事先不知道数组大小 - 例如将完整矩阵转换为稀疏矩阵时.
当然,现代Fortran提供"自动数组"和"可分配数组".但这些并没有出现在1977年.如果没有这些结构,F77的人如何管理?
我想在fortran初始化一个大整数数组,我试过:
integer(kind=8) :: XGrid(1:20)
Run Code Online (Sandbox Code Playgroud)
但整数仍然是默认类= 4.我后来在数组中添加了数字:
XGrid = (/3002, 3340403,....,19460630000/)
Run Code Online (Sandbox Code Playgroud)
我收到"此数字常量超出范围"错误.因为它不适合一种kind = 4 int,但会在一种= 8 int.
我也尝试将其声明为:
integer, parameter :: ik8 = selected_int_kind(8)
integer(ik8) :: XGrid(1:20)
Run Code Online (Sandbox Code Playgroud)
但这也行不通.
编辑:感谢Vladimir F,但我试图定义一个数组而不仅仅是一个变量,因此我无法理解如何调整使用的答案: Fortran 90中有更好的双精度赋值吗? 可不可能是:
integer, parameter :: ik8 = selected_int_kind(8)
integer(ik8) :: XGrid(1:20)_ik8
XGrid = (/3002_ik8, 3340403_ik8,....,19460630000_ik8/)
Run Code Online (Sandbox Code Playgroud)
还是不一样?谢谢
我的理解是Fortran(90之前)非常快,部分原因是它不允许指针别名(因此允许更好的编译器优化).但是,我也知道C语言语言中的指针允许程序员编写极其快速的代码.
我不明白为什么这两种语言因为相反的原因而快速.任何人都可以了解正在发生的事情吗?
提前致谢.