我刚刚开始在模块上创建一个菜单功能,我遇到致命错误,错误太多.我怀疑这可能是由于一个小错误而不是多个,因为代码现在非常简单.
有人有什么想法吗?
以下是我到目前为止的情况.显然我刚刚开始,但我很惊讶为什么会出现问题.非常感谢!
另外我对模块有点新意,所以我只是好奇你能告诉我这是不是如何编译它?g95 themenu.f95 -o ba ??
谢谢.
MODULE themenu
IMPLICIT NONE
INTEGER:: choices, opt
opt=choices()
CONTAINS
INTEGER FUNCTION choices ()
INTEGER:: opt
DO
PRINT*, "1: Add an item manually"
PRINT*, "2: Add item(s) from a file"
PRINT*, "3: Add random item from list of top ten list"
PRINT*, "4: Print list with totals"
PRINT*, "5: Sort list alphabetically"
PRINT*, "6: Sort list by price"
PRINT*, "7: Write list to file"
PRINT*, "8: EXIT"
PRINT*, " "
PRINT*, "Please …Run Code Online (Sandbox Code Playgroud) 假设我有一个非常大的数组 verybigvariable
我已经定义了一个执行这样的操作的函数
function myfunc(var) result(res)
real:: var(:,:,:),res
...
...
...
end function myfunc
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我这样调用这个函数时
myvar=myfunc(verybigvariable)
Run Code Online (Sandbox Code Playgroud)
怎么了?它是否复制了我的变量,因此它在执行函数期间在ram中保存了2X空间?如果是这样我怎么能阻止这个?(在一个简单的程序中,我知道,我可以在没有任何参数的情况下定义函数并使其使用现有变量,但如果我正在编程模块,似乎我必须在定义中包含参数)
我想在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)
还是不一样?谢谢
当我将我的包提交给CRAN时,它不会通过自动传入检查并发出以下警告:
* checking whether package 'EpiILM' can be installed ... WARNING
Found the following significant warnings:
Warning: GNU Extension: Different type kinds at (1)
Run Code Online (Sandbox Code Playgroud)
和相应的日志文件说
Epimcmc.f95:440.25:
psi= min(1.0,exp(ratio))
1
Warning: GNU Extension: Different type kinds at (1)
Run Code Online (Sandbox Code Playgroud)
当我使用R CMD CHECK和R CMD CHECK --as-cran测试我的包装时,都不会产生任何警告或注释.我正在使用R版本3.3.2(2016-10-31) - 我的MacOS上的"真诚的南瓜补丁"和代码是用Fortran 95编写的.
有什么建议?
说我有以下代码:
program test
call foo
call foo
contains
subroutine foo
integer(8),dimension(:),allocatable:: var1
allocate(var1(10))
...
return
end subroutine foo
end
Run Code Online (Sandbox Code Playgroud)
变量var1会被分配两次吗?(我猜是).如果为每个呼叫分配,第一次呼叫期间分配的内存是否会空闲?
fortran memory-management dynamic-memory-allocation fortran90 fortran95
我们有一个用Fortran 90编写的复杂程序,我只能找到Fortran 95编译器.不幸的是,我的访问和体验有限,但需要立即了解问题.
Fortran 90代码是否总能使用Fortran 95编译器(例如gfortran)正确编译?
我在 Fortran 95 中编写了一个基本算法,使用通过称为理查森外推法的过程增强的中心差来计算函数的梯度(代码中规定了一个示例)。
function f(n,x)
! The scalar multivariable function to be differentiated
integer :: n
real(kind = kind(1d0)) :: x(n), f
f = x(1)**5.d0 + cos(x(2)) + log(x(3)) - sqrt(x(4))
end function f
!=====!
!=====!
!=====!
program gradient
!==============================================================================!
! Calculates the gradient of the scalar function f at x=0using a finite !
! difference approximation, with a low order Richardson extrapolation. !
!==============================================================================!
parameter (n = 4, M = 25)
real(kind = kind(1d0)) :: x(n), xhup(n), xhdown(n), …Run Code Online (Sandbox Code Playgroud) 我在这里得到了一段代码,我似乎无法找到将这段代码转换为Fortran 95等效代码的有效方法.我已经尝试了好几件事,但我总是坚持用矩阵制作一维数组,反之亦然(重点是减少计算时间,如果我转换它们,我想不出另一种方法,而不是使用循环再次:/).
这是一段代码:
do i=1,dim
do j=1,dim
Snorm(i,j)=Sval(j)/Sval(i)
Bnorm(i,j)=Bval(j)/Bval(i)
Pnorm(i,j)=Pval(j)/Pval(i)
enddo
enddo
Run Code Online (Sandbox Code Playgroud)
你会如何在Fortran95代码中编写它?
R中矩阵计算的等价物如下:
Snorm <- t(Sval %*% t(1/Sval))
Bnorm <- t(Bval %*% t(1/Bval))
Pnorm <- t(Pval %*% t(1/Pval))
Run Code Online (Sandbox Code Playgroud)
Python中的等价物是这样的:
Snorm = (numpy.dot((Svalmat.T),(1/Svalmat))).T
Bnorm = (numpy.dot((Bvalmat.T),(1/Bvalmat))).T
Pnorm = (numpy.dot((Pvalmat.T),(1/Pvalmat))).T
with Svalmat etc the equivalent of Sval, but then columnmatrix
Run Code Online (Sandbox Code Playgroud)
有人有想法吗?
我在这部分代码中遇到浮点溢出错误。有哪位大佬能帮我看看是什么原因吗?
do j=1,ny-1
do i=1,nx-1
sum = 0.0d0
do k=0,1000
n=2.0d0*dfloat(k)+ 1.0d0
sum = sum + ((dsinh(n*pi*x(i))*dcos(n*pi*y(j)))/((n*n*pi*pi)*dsinh(2*n*pi)))
end do
ue(i,j)= (x(i)/(4.0d0))- 4.0d0*sum
end do
end do
Run Code Online (Sandbox Code Playgroud)