我在Fortran 95上有一个非常可怕的错误:
Fatal Error: While reading module 'list5.mod' found module version 0, expected 6
Run Code Online (Sandbox Code Playgroud)
我已经包含了我的模块的主要结构.我非常怀疑它与我的模块中的内容有什么关系,因为它给了我关于那些的错误信息,我已经能够修复它们,这意味着它能够通过我的模块很好,它只是与我使用模块的方式.也许?
MODULE list5
IMPLICIT NONE
CONTAINS
----
END MODULE
Run Code Online (Sandbox Code Playgroud)
主程序的结构如下:
PROGRAM mainlist
USE list5
IMPLICIT NONE
!Variable Declaration
INTEGER:: opt
INTEGER, PARAMETER:: maxitems=50
INTEGER:: size=0
CHARACTER(20):: itemarray(50)
INTEGER:: quantityarray(50)
INTEGER:: totalquantity, i=0
REAL:: totalprice=0, pricearray(50)=0
CHARACTER(20), DIMENSION(:)::Item
CHARACTER(20):: ItemSought
LOGICAL:: Found
INTEGER:: Location
INTEGER:: NumItems=0, SmallestItem=0
!Select statement for the menu
DO
opt=choices()
SELECT CASE (opt)
CASE(1)
size=size+1
CALL getItemData(itemarray,pricearray,quantityarray)
CASE(2)
CALL getFileItems(size,itemarray,pricearray,quantityarray)
CASE(3)
CALL pickItemRandomly …Run Code Online (Sandbox Code Playgroud) 使用g95编译器,我有一个错误:
Error: Operands of comparison operator '.EQ.' at (1) are LOGICAL(4)/LOGICAL(4)
Run Code Online (Sandbox Code Playgroud)
我不知道这是什么意思.我包括子程序.你有任何想法如何解决这个问题?
非常感谢你的时间.
SUBROUTINE search(iarray, ItemSought, Found, Location)
CHARACTER(20), DIMENSION(50),INTENT(IN)::itemarray
CHARACTER(20)::ItemSought
LOGICAL, INTENT(OUT)::Found
INTEGER, INTENT(OUT)::Location
INTEGER:: First, Last, Middle
WRITE(*,'(1x,A)',ADVANCE="NO"),"What are you searching for? "
READ*, ItemSought
First=1
Last=SIZE(Iarray)
FOUND = .FALSE.
DO
IF ((First > Last) .OR. Found) RETURN
Middle = (First+Last)/2
IF (ItemSought < Iarray(Middle)) THEN
Last=Middle-1
ELSE IF (ItemSought > Iarray(Middle)) THEN
First=Middle+1
ELSE
Found = .TRUE.
Location = Middle
END IF
END DO
IF …Run Code Online (Sandbox Code Playgroud) 问题很明显我认为,虽然我用Google搜索,但我找不到任何解决方案.我想划分我的源代码以使其更易于维护.如何引用另一个文件中的模块?
我有一个Fortran程序,我需要修改,所以我正在读它并试图理解.你可以解释一下以下语句中的格式化字符串是什么意思:
write(*,'(1p,(5x,3(1x,g20.10)))') x(jr,1:ncols)
Run Code Online (Sandbox Code Playgroud) 有没有办法在不使用显式do循环的情况下初始化随机数组?
现在我的随机矩阵初始化看起来像
program Main
implicit none
save
integer :: seed, i, j
real :: x
character(100) :: option
real, dimension(10,10) :: matrix
if (iargc() > 0) then
CALL GETARG(1,option)
read(option,*) seed
else
seed = 1
end if
call RANDOM_SEED(seed)
do i=1,10
do j=1,10
call RANDOM_NUMBER(x)
matrix(i,j) = x
end do
end do
end program
Run Code Online (Sandbox Code Playgroud)
但是如果可能的话,我希望它更像是隐含的do-loop数组初始化:
program Main
implicit none
save
integer :: seed
character(100) :: option
real, dimension(10,10) :: matrix
if (iargc() > 0) then
CALL GETARG(1,option)
read(option,*) seed
else …Run Code Online (Sandbox Code Playgroud) 可能是一个愚蠢的问题,但有没有办法为变量的离散值运行循环?最新版本怎么样?
就像是
for i in 1 5 9 11 31 77
Run Code Online (Sandbox Code Playgroud)
在Unix shell脚本中使用?
谢谢.
如果参数列表的长度不同,Fortran 95 标准是否允许两个子例程(或函数)具有相同的名称?例如,
subroutine a(i)
! code here
end subroutine a
subroutine a(j,k)
! code here
end subroutine a
Run Code Online (Sandbox Code Playgroud) 当我编译下面的程序时,我在call Coor_Trans命令行中出现错误和警告
警告:行被截断
错误:参数列表中的语法错误
我多次编译程序,但它不起作用.也许我的呼叫命令有问题.
program 3D
implicit none
integer :: i,j,k
integer, parameter :: FN=2,FML=5,FMH=5
integer, parameter :: NBE=FN*FML*FMH
real, parameter :: pi = 4*atan(1.0)
real(kind=4), dimension(1:FN,1:FML+1,1:FMH+1) :: BEXL,BEYL,BEZL
real(kind=4), dimension(1:FN,1:FML,1:FMH) :: BEXC,BEYC,BEZC,BE2A,BE2B,ANGLE
real(kind=4), dimension(1:NBE,1:1,1:1) :: BEXC1,BEYC1,BEZC1,BE2A1,BE2B1,ANGLE1
real(kind=4), dimension(1:NBE,1:NBE) :: LOC_PTS1,LOC_PTS2,LOC_PTS3
real :: LOC_1,LOC_2,LOC_3
do i=1,FN
do j=1,FML
do k=1,FMH
BEXC(i,j,k) = 0.5*(BEXL(i,j,k) + BEXL(i,j+1,k))
BEYC(i,j,k) = 0.5*(BEYL(i,j,k) + BEYL(i,j+1,k))
BEZC(i,j,k) = 0.5*(BEZL(i,j,k) + BEZL(i,j,k+1))
BE2A(i,j,k) = FL(i)/FML + j*0 + k*0
BE2B(i,j,k) = FH(i)/FMH + j*0 …Run Code Online (Sandbox Code Playgroud) 如何在调用函数参数时保留其值而不创建新变量?这就是,如何按值传递参数?
在此示例代码中:
program what
implicit none
integer :: a, b, c, d
a = 1
b = 2
c = 3
print *, a,b,c
d = f(val(a), val(b), val(c))
print *, d
print *, a,b,c
d = f(a, b, c)
print *, d
contains
function f(x,y,z) result(h)
integer:: x,y,z
integer :: h
h = x+y+z
x = 0
y = 0
z = 0
end function
end program
Run Code Online (Sandbox Code Playgroud)
当我第二次调用该函数时,它只打印 0。
我有两个数组,我想比较它们的大小并将尾随零添加到较短的数组。
例如-对于数组-
y1=(/ 1,2,3 /)
y2=(/ 1,2,3,4,5 /)
Run Code Online (Sandbox Code Playgroud)
最后的结果应该是——
y1=(/ 1,2,3,0,0 /)
y2=(/ 1,2,3,4,5 /)
Run Code Online (Sandbox Code Playgroud)
我对 Fortran 很陌生,据我所知,到目前为止,可以这样做:-
integer, allocatable :: y1(:),y2(:)
integer :: l1,l2,i
.
.
.
! some code to generate y1 and y2 here
.
.
.
l1=size(y1)
l2=size(y2)
if (l1>l2) then
do i=l2+1,l1
y2(i)=0
enddo
else if (l2>l1) then
do i=l1+1,l2
y1(i)=0
enddo
endif
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法来做到这一点,最好是不涉及循环的方法,因为我正在处理的实际问题可能有很大的向量