在我必须处理的一些Fortran 77代码中,有一些指针以非常奇怪的方式声明,
pointer (iuu , uu ), (ivv , vv ),
$ (it , t ), (iq , q ), (ips , ps ),
$ (ittm , ttm ), (itqm , tqm ), (ipsm , psm ),
Run Code Online (Sandbox Code Playgroud)
这里的括号是什么意思?什么?
例如,我想以 2 为增量从 1 循环到 500。但是,对于每 8 个循环,我想跳过接下来的 18 个循环(使 do 变量增加 18)。我怎么做?
我的代码是:
event = 0
do i = 1,500,2
event = event + 1
if (event .eq. 8) then
i = i + 18
event = 0
endif
enddo
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误消息:“DO 主体中的 do 变量不应出现在变量定义上下文中”。基本上我不能改变循环中的变量“i”。那么我应该如何编写代码来实现它呢?
谢谢。
目前我正在使用 gfortran 6.1 在 mac 上编译 fortran95 源代码。我想知道是否可以使用相同的方法运行 FORTRAN 77 源代码。如果没有,有什么建议吗?
例如,
SUBROUTINE DoSomething (Z,L)
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
D=Z*77.1234567D0
L=D
RETURN
END
Run Code Online (Sandbox Code Playgroud)
为了说话的目的,让我们假设D等于-1.5,在这种情况下L将等于-1或-2.换句话说,它是向上舍入还是向下舍入?
提前致谢.
我是 Fortran 新手。所以我需要帮助。我在 SUSE 上使用 gfortran 编译我的代码并收到以下错误:
200 IF ( ID .EQ. 4HEOT ) GO TO 20
1
Error: Operands of logical operator '.eq.' at (1) are INTEGER(4)/HOLLERITH
Run Code Online (Sandbox Code Playgroud)
代码的主文件附加在下面的链接中,其中 1818 行显示了错误。
我的文件的链接是:https://files.engineering.com/getfile.aspx? folder=cd6961f3-d38b-4e61-a43d-269fa18c7d11&file=sfeng.f
如何解决这个问题?
对于简化/最小的示例,我在此处添加了代码:
SUBROUTINE CDRD ( II )
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
c ohad 15/7/08
c IMPLICIT INTEGER*8 (I-N)
IMPLICIT INTEGER*4 (I-N)
C*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=C
C THIS SUBROUTINE READS PROPULSION SYSTEM DRAG DATA. C
C C
C USE NON-ZERO "II" TO WRITE TABLE DATA. C
C*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=C
CHARACTER*80 TITLE, CDFILE …Run Code Online (Sandbox Code Playgroud) 我正在用C开发一个应该使用C,C++或Fortran代码的库.它使用的一种机制是捕获堆栈,堆或数据/ bss段中的页面的写入.在这种情况下,"堆"是库从映射文件创建的特殊堆.我发现我的库未能在Fortran应用程序中捕获对变量的写入.变量声明为
double precision u(5,I,J,K)
Run Code Online (Sandbox Code Playgroud)
其中I,J和K是整数参数(即常数).然后代码将u包含在称为"字段"的公共块中.
在GDB下调试时,我发现u的地址不属于三个数据段中的任何一个.(因此库无法捕获写入!)然后我查看/ proc // maps伪文件,发现u的地址落入系统注释为"堆"的范围内.但你是怎么进入这个"堆"的?在这种情况下,Fortran 77代码不使用非标准的"allocate"关键字在堆上进行分配.有人可以向我解释Fortran 77(在Ubuntu Linux x86-64下)在"堆"上分配的变量,以及首先如何创建这个"堆"?
是否有可能在Fortran中有函数指针?现在我有一些像这样的代码的代码:
subroutine flag(iflag,a,b)
integer n, a, b, ii, iflag
do ii = 1, n
if (iflag.eq.0) a+b
else a-b
end do
return
end
Run Code Online (Sandbox Code Playgroud)
变量"n"具有巨大的值,因此为了运行此代码,我觉得我浪费了很多时间使用"if"命令.是否可以编写类似函数指针的东西(我不确定我的意思),这样在代码中执行如下操作:
subroutine flag(iflag,a,b)
*depending on the iflag the subroutine flag is automatically
precompiled to call either flag_plus or flag_minus*
return
end
subroutine flag_plus(a,b)
integer n, a, b, ii
do ii = 1, n
a+b
end do
return
end
subroutine flag_minus(a,b)
integer n, a, b, ii
do ii = 1, n
a-b
end do
return
end
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我可以通过避免"if"循环来节省大量时间.这样的东西有可能远程吗?
我在Fedora 20 x86_64上使用gfortran [GNU Fortran(GCC)4.8.3 20140911(Red Hat 4.8.3-7)]来编译一堆以以下方式引用“ iargc”功能的Fortran 77代码:
bin2D2nc.f:31:整数iargc,strlen1
bin2D2nc.f:32:外部iargc,strlen1
bin2D2nc.f:44:i = iargc()
当make脚本到达以下编译命令时,
gfortran -O3 -ffixed-line-length-132 -fall-intrinsics -I/home/santiago/Install/netcdf_sam/include -o bin2D2nc -I./SRC ./SRC/bin2D2nc.f ./SRC/hbuf_lib.f ./SRC/cape.f ./SRC/cin.f -L/home/santiago/Install/netcdf_sam/lib -lnetcdf -L/usr/lib64 -lpthread
Run Code Online (Sandbox Code Playgroud)
我收到以下消息:
bin2D2nc.f :(。text + 0x14):对'iargc_'的未定义引用
collect2:错误:ld返回1退出状态
make:** [bin2D2nc]错误1
我不是这段代码的作者。据我所知,我在makefile中正确设置了库路径。
我发现'iargc'是GNU Fotran 77向后兼容的例程,但我对此并不了解。
有人可以建议解决这个问题吗?
我有二维数组
real triangle(0:2, 0:1)
Run Code Online (Sandbox Code Playgroud)
其中“三角形”是一个向量数组(一维数组),我也有子程序
subroutine vecSub(lhs, rhs, result)
real lhs(0:1), rhs(0:1), result(0:1)
result(0) = lhs(0) - rhs(0)
result(1) = lhs(1) - rhs(1)
return
end
Run Code Online (Sandbox Code Playgroud)
有没有办法将“三角形”变量中的向量之一传递给这个子程序?Fortran-90 可以做到这一点:triangle(0, :)它给出了第一个三角形数组,但我只能使用 FORTRAN-77,所以这不行,有什么建议吗?
在现代 Fortran 中,我们可以使用 C 绑定从 C 调用子例程。例如 Fortran 子例程将如下所示
subroutine my_routine(...) bind (C, name="my_routine")
Run Code Online (Sandbox Code Playgroud)
但是,如果 fortran 子例程是旧的 f77 子例程,则此绑定可能不是可用的解决方案。最好的选择是什么?