在Fortran中,我可以使用三种方法从子例程返回数组.第一个是通过intent(out)参数.第二个是通过具有阵列的函数result.第三个是具有作为result指向数组的指针的函数,该函数在函数中分配.
每种方法的优点和缺点是什么?
我写的是fortran(90).我的程序必须读取file1,对它的每一行做一些事情并将结果写入file2.但问题是 - file1在第一行有一些不需要的信息.
如何使用Fortran从输入文件中跳过一行?
代码:
open (18, file='m3dv.dat')
open (19, file='m3dv2.dat')
do
read(18,*) x
tmp = sqrt(x**2 + 1)
write(19, *) tmp
end do
Run Code Online (Sandbox Code Playgroud)
第一行是文本和数字的组合.
我需要Fortran(90)中的(真实)数组的深层副本,但我不确定如何获得一个,因为我不完全理解引用是如何工作的.直观地说,我希望这能得到我想要的东西:
do i=1,n
b(i) = a(i)
end do
Run Code Online (Sandbox Code Playgroud)
但是,最近我向我指出这b(1:n) = a(1:n)相当于上面的代码.直观地说,我希望这b(1:n) = a(1:n)只会导致引用b(1:n)指向a(1:n)内存中的位置.
是b(1:n) = a(1:n)深刻的副本?为什么?与基础参考相反的是b = a什么?
我不了解FORtran 90 中CONTAINS语句的重要性
例如
PROGRAM BLABLA
IMPLICIT NONE
INTEGER :: i,j,k
i = 1; j = 1;k =1
PRINT *, i,j,k
CALL ABC(i,j,k)
PRINT *, i,j,k
CONTAINS
SUBROUTINE ABC(r,s,t)
IMPLICIT NONE
INTEGER, INTENT(IN) :: r,s
INTEGER, INTENT(OUT) :: t
t = r + s
END SUBROUTINE ABC
END PROGRAM BLABLA
Run Code Online (Sandbox Code Playgroud)
一种是通过在主程序之外定义子例程。我知道对于函数来说,需要指定函数的类型,但是对于子例程则不需要。我有兴趣了解这样做是否还有其他警告?
PROGRAM BLABLA
IMPLICIT NONE
INTEGER :: i,j,k
i = 1; j = 1;k =1
PRINT *, i,j,k
CALL ABC(i,j,k)
PRINT *, i,j,k
END PROGRAM BLABLA
SUBROUTINE ABC(r,s,t) …Run Code Online (Sandbox Code Playgroud) 我有这个简单的Fortran 90程序:
subroutine apc_wrapper(i, j, k)
implicit none
integer*8, intent(in) :: i, j
integer*8, intent(out) :: k
double precision t
k = i + js
end subroutine
Run Code Online (Sandbox Code Playgroud)
编译为共享库
gfortran -O2 -shared -fPIC apc_wrapper.f90 -o apc_wrapper.so
Run Code Online (Sandbox Code Playgroud)
现在,我想从Julia调用这个子例程,带有所有整数参数,就像这样
i = 2
j = 3
k = 0
ccall( (:apc_wrapper_, "./apc_wrapper.so"), Void, (Ptr{Int64}, Ptr{Int64}, Ptr{Int64}), &i, &j, &k)
Run Code Online (Sandbox Code Playgroud)
但它不会起作用.k不会改变它的值并继续评估为0.
但是,如果我这样做
i = 2
j = 3
kk = [0]
ccall( (:apc_wrapper_, "./apc_wrapper.so"), Void, (Ptr{Int64}, Ptr{Int64}, Ptr{Int64}), &i, &j, kk)
Run Code Online (Sandbox Code Playgroud)
也就是说,使用数组存储输出,它的工作原理!调用子例程后,kk …
这个Fortran代码的含义是什么:
IF (J1-3) 20, 20, 21
21 J1 = J1 - 3
20 IF (J2-3) 22, 22, 23
23 J2 = J2 - 3
22 CONTINUE
Run Code Online (Sandbox Code Playgroud)
我在旧项目中看到过,我不知道带有数字(标签)的IF是什么意思.
我需要在Fortran 90中将一些数据写入文件.我应该如何使用列WRITE (*,*) input分组的值?总是在每次通话后放一个,这就是问题所在.WRITEnew line
代码示例:
open (unit = 4, file = 'generated_trajectories1.dat', form='formatted')
do time_nr=0, N
write (4,*) dble(time_nr)*dt, initial_traj(time_nr)
end do
Run Code Online (Sandbox Code Playgroud)
现在重点是将它写在不同的列中.
我在Fortran90程序中有以下数据结构:
TYPE derivedType
CHARACTER(100) :: name = ' '
INTEGER :: type = 0
REAL(KIND(1.0D0)) :: property = 0.0
END TYPE derivedType
TYPE (derivedType), ALLOCATABLE, DIMENSION(:) :: arrayOfDerivedTypes
Run Code Online (Sandbox Code Playgroud)
当我尝试在GDB中调试和打印值时:
(gdb) p arrayOfDerivedTypes(1)%name
Run Code Online (Sandbox Code Playgroud)
我得到非敏感值(通常为零,正斜杠和字母串)或完全错误的值(如arrayOfDerivedTypes(1)%name = 9,当我知道它是= 2时).如何让GDB打印正确的值?
我知道:
我不想经历编译GDB的单独分支以测试它是否解决了这个问题的麻烦,如果有人已经知道它不会或者是否有更好的解决方案可用.
我很难想象还没有解决方案.fortran社区没有更好的免费调试器解决方案吗?
是否有可能直接在函数的返回值上使用索引?像这样的东西:
readStr()(2:5)
Run Code Online (Sandbox Code Playgroud)
wherereadStr()是一个返回字符串或数组的函数。在许多其他语言中,这是很有可能的,但是 Fortran 呢?我的示例中的语法当然无法编译。有没有其他语法可以使用?
我在我的Ubuntu 15.04系统上安装了gfortran.在编译Fortran代码时,DO循环仅要求获取整数参数,而不是实数值或变量.这包括循环变量和步骤表达式.为什么它也不能采取真正的价值观呢?
以下是从这里开始的程序,练习3.5的嵌套do循环部分.
program xytab
implicit none
!constructs a table of z=x/y for values of x from 1 to 2 and
!y from 1 to 4 in steps of .5
real :: x, y, z
print *, ' x y z'
do x = 1,2
do y = 1,4,0.5
z = x/y
print *, x,y,z
end do
end do
end program xytab
Run Code Online (Sandbox Code Playgroud)
编译后显示的错误是:
xytab.f95:8.4:
do y = 1,4,0.5
1
Warning: Deleted feature: Loop variable at (1) …Run Code Online (Sandbox Code Playgroud) fortran ×10
fortran90 ×10
gfortran ×2
arrays ×1
contains ×1
file-io ×1
formatting ×1
fortran2003 ×1
fortran95 ×1
gdb ×1
julia ×1
subroutine ×1