在Fortran中,变量的声明语句是否可以引用先前声明的变量?例如,当我尝试以下操作时:
PROGRAM test3
IMPLICIT NONE
INTEGER :: a=2286
INTEGER :: b=a/3
WRITE(*,*) a, b
END PROGRAM test3
Run Code Online (Sandbox Code Playgroud)
我收到编译时错误消息:
test3.f90:5.16:
INTEGER :: b=a/3
1
Error: Parameter 'a' at (1) has not been declared or is a variable, which
does not reduce to a constant expression
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我在一个与b的声明分开的语句中将b分配给/ 2,它编译并运行正常:
PROGRAM test3
IMPLICIT NONE
INTEGER :: a=2286
INTEGER :: b
b=a/3
WRITE(*,*) a, b
END PROGRAM test3
Run Code Online (Sandbox Code Playgroud)
这给了我正确的输出:
2286 762
Run Code Online (Sandbox Code Playgroud)
为什么会这样 - 先前声明的变量不能包含在新变量的声明语句中?难道我做错了什么?或者这只是"生活中的Fortran事实"?
非常感谢您的宝贵时间!
我正在阅读http://en.wikibooks.org/wiki/Fortran/Fortran_simple_input_and_output 上的 Fortran 教程。在下面的程序中,unit=out_unit 做什么?
program xproduct
implicit none
integer :: i,j
integer, parameter :: out_unit=20
print*,"enter two integers"
read (*,*) i,j
open (unit=out_unit,file="results.txt",action="write",status="replace")
write (out_unit,*) "The product of",i," and",j
write (out_unit,*) "is",i*j
close (out_unit)
end program xproduct
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序时,文本文件 results.txt 包含以下文本:
The product of 2 and 3
is 6
Run Code Online (Sandbox Code Playgroud) 这与我最近关于Fortran流等的帖子有些相关:将存储在Fortran 90二进制文件中的数据转换为人类可读格式.
我试图将一个简单的整数数组写入一个文件,然后使用Fortran的READ函数然后读入我创建的二进制文件.我通过包含ACCESS="STREAM"在我的OPEN指令中使用流.我有以下代码:
MODULE streamtest2subs
IMPLICIT NONE
CONTAINS
SUBROUTINE writeUstream(myarray)
IMPLICIT NONE
INTEGER, INTENT(IN), DIMENSION(4,10) :: myarray
INTEGER :: myvalue = 12345, mypos
OPEN(UNIT=11, FILE="ustream.demo", STATUS="REPLACE", ACCESS="STREAM")
WRITE(11) myarray
CLOSE(UNIT=11)
END SUBROUTINE writeUstream
SUBROUTINE readUstream
IMPLICIT NONE
INTEGER :: test1, test2, test3
INTEGER :: n
OPEN(UNIT=42, FILE="ustream.demo", STATUS="OLD", ACCESS="STREAM")
READ(42, POS=1) test1
READ(42, POS=2) test2
READ(42, POS=3) test3
WRITE(*,*) "This is the output:"
WRITE(*,*) test1
WRITE(*,*) test2
WRITE(*,*) test3
END SUBROUTINE readUstream …Run Code Online (Sandbox Code Playgroud) 我正在关注C编程教程http://www.cprogramming.com/tutorial/c/lesson10.html.这个特殊的教程用C语言教文件I/O; 特别是,讨论了fopen命令.有一次,他们给出了以下示例(我认为应该打印文件test.txt的内容):
FILE *fp;
fp=fopen("c:\\test.txt", "w");
fprintf(fp, "Testing...\n");
Run Code Online (Sandbox Code Playgroud)
因此,我创建了一个名为test.txt的文本文件,并将其保存在我当前的工作目录中(C:\ cygwin\home\Andrew\cprogramming).然后我在同一目录中创建了ac文件,它包含以下代码:
#include <stdio.h>
int main()
{
FILE *fp;
fp=open("test.txt","w");
fprintf(fp,"Testing...\n");
}
Run Code Online (Sandbox Code Playgroud)
当我使用gcc编译这个c文件(我称之为helloworld2.c)时,我收到以下消息:
helloworld2.c: In function `main':
helloworld2.c:40: warning: assignment makes pointer from integer without a cast
Run Code Online (Sandbox Code Playgroud)
然后,当我尝试运行可执行文件时,我得到:
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
你对我接下来应该尝试什么有什么想法吗?
非常感谢您的宝贵时间.
我ran0从文本数字食谱中获取了以下功能.我写了自己的程序random2来打电话ran0.
为什么此代码会导致分段错误?谢谢你的时间.
FUNCTION ran0(idum)
INTEGER idum,IA,IM,IQ,IR,MASK
REAL ran0,AM
PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836,MASK=123459876)
INTEGER k
idum=ieor(idum,MASK)
k=idum/IQ
idum=IA*(idum-k*IQ)-IR*k
if (idum.lt.0) idum=idum+IM
ran0=AM*idum
idum=ieor(idum,MASK)
return
END FUNCTION
PROGRAM random2
IMPLICIT NONE
REAL :: ran0
PRINT *, ran0(6)
END PROGRAM
Run Code Online (Sandbox Code Playgroud)