返回首页
1、初始化变量格式
问题详情:
在定义变量的同时进行赋值出现报错,代码如下:
program main
integer a=12
write(*,*) a
end program
程序报错如下:
E:\vs code\fortran\demo.f90:2:13:
integer a=12
1
Error: Syntax error in data declaration at (1)
问题原因:
语法错误,在声明变量的同时给变量赋值需要在类型和变量名之间加两个冒号。
只需要将代码改成下面代码即可:
program main
integer::a=12
write(*,*) a
end program
2、逻辑值的表示
问题详情:
在给逻辑型变量赋值的时候出现报错,代码如下:
program main
logical judge
judge=.true
print*, judge
end program
程序报错如下:
E:\vs code\fortran\demo.f90:3:11:
judge=.true
1
Error: Invalid character in name at (1)
问题原因:
语法错误,逻辑值为.true.和.false.。
只需要将代码改成下面代码即可:
program main
logical judge
judge=.true.
print*, judge
end program
3、implicit none语句
问题详情:
原来可以正常运行的程序在第一行加上implicit none语句就报错,代码如下:
program main
implicit none
integer::a=2
i=3
print*, a,i
end program
程序报错如下:
E:\vs code\fortran\demo.f90:4:5:
i=3
1
Error: Symbol 'i' at (1) has no IMPLICIT type
问题原因:
implicit none语句是Fortran里的一条特殊语句,其作用是要求程序中的所有变量都需要事先声明才能使用,
所以在原来的程序里没有提前声明的变量i在加上implicit none语句之后报错。
只需要补上变量i的声明即可:
program main
implicit none
integer::a=2,i
i=3
print*, a,i
end program
4、if-else语句
问题详情:
在使用if-else语句时报错,代码如下:
program main
integer x
read(*,*) x
if(x>0) then
print*,"x>0"
else if(x<0)
print*,"x<0"
end if
end program
程序报错如下:
E:\vs code\fortran\demo.f90:6:11:
else if(x<0)
1
Error: Unexpected junk after ELSE statement at (1)
问题原因:
if-else语句的格式问题,只有else后面不用加then,
if和else if后面都需要加then
只需要在else if语句后补上then即可:
program main
integer x
read(*,*) x
if(x>0) then
print*,"x>0"
else if(x<0) then
print*,"x<0"
end if
end program
5、integer溢出
问题详情:
给整型变量赋较大的值会报错,代码如下:
program main
integer::a=2147483648
print*, a
end program
程序报错如下:
E:\vs code\fortran\demo.f90:2:25:
integer::x=2147483648
1
Error: Integer too big for its kind at (1). This check can be disabled with the option -fno-range-check
问题原因:
Fortran默认的integer的kind值是4,即分配4个字节,只能表示大小在-2^31+1到2^31-1的数(2147483648=2^31),
为了表示或处理更大的数,可以选择修改integer的kind值,也可以换用double precision类型的变量。
这里演示第二种方法,将代码改成下面代码即可:
program main
double precision::a=2147483648.0
print*, a
end program
6、一行的字符太长
问题详情:
写代码的时候有一行写得太长而报错,代码如下:
program main
integer::x=1
write(*,100) x,x+1,x+2,x+3,x+4
100 format("输入的数据中,和最大的相邻五个数是第",I2,"个数,第",I2,"个数,第",I2,"个数,第",I2,"个数,第",I2,"个数。")
end program
程序报错如下:
E:\vs code\fortran\demo.f90:4:132:
100 format("杈2,"涓2,"涓2,"涓2,"涓2,"涓01;31m1
Error: Line truncated at (1) [-Werror=line-truncation]
E:\vs code\fortran\demo.f90:4:132:
100 format("杈2,"涓2,"涓2,"涓2,"涓2,"涓01;31m1
Error: Unexpected end of format string in format string at (1)
E:\vs code\fortran\demo.f90:3:34:
write(*,100) x,x+1,x+2,x+3,x+4
1
Error: FORMAT label 100 at (1) not defined
f951.exe: some warnings being treated as errors
问题原因:
由于Fortran自由格式文件一行最长只能写132个字符,而一个中文字符占两个字符数,故原来的代码第4行的字符数超出了Fortran一行的最大字符数而报错。
只需要用连接符&换行即可。
将代码改成如下:
program main
integer::x=1
write(*,100) x,x+1,x+2,x+3,x+4
100 format("输入的数据中,和最大的相邻五个数是第", &
I2,"个数,第",I2,"个数,第",I2,"个数,第",I2,"个数,第",I2,"个数。")
end program
7、输出异常
问题详情:
在使用format语句输出时,屏幕没有输出值而是显示*号,代码如下:
program main
integer a,b
a=12
b=123456789
write(*,100) a,b
100 format(I3,I5)
end program
程序输出如下:
E:\vs code\fortran> main.exe
12*****
问题原因:
输出*号是由于字段宽度不够,因为变量b应该占9个字符,而format语句只分配了5个字符的位置,不够显示,所以显示为*号。
只需要将代码改成下面代码即可:
program main
integer a,b
a=12
b=123456789
write(*,100) a,b
100 format(I3,I10)
end program
8、在CodeBlock中使用call system("chcp 65001")报错
问题详情:
使用call system("chcp 65001")解决CodeBlock输出中文乱码的问题时,在如下代码片段中出现报错:
real f,df,x,y
call system('chcp 65001')
f(x)=x**3-2*x+x-1
df(x)=3*x**2-4*x+1
(在其他编辑器中如vscode也会报错)出现报错:
E:\vs code\fortran\9-2.f90:6:4:
f(x)=x**3-2*x**2+x-1
1
Error: Unclassifiable statement at (1)
E:\vs code\fortran\9-2.f90:7:4:
df(x)=3*x**2-4*x+1
1
Error: Unclassifiable statement at (1)
问题原因:
由于语句函数的声明属于非执行语句,而call system("chcp 65001")为执行语句。
在Fortran中所有的非执行语句都要放到执行语句前面,否则会报错。
将代码改成下面代码即可:
real f,df,x,y
f(x)=x**3-2*x+x-1
df(x)=3*x**2-4*x+1
call system('chcp 65001')
9、打开文件失败
问题详情:
事先新建了一个temp.txt文件在同一个文件夹下,并写入一个整数保存,但在使用open语句打开文件时报错,代码如下:
program main
integer x
open(1,file="temp")
read(1,*) x
close(1)
print*, x
end program
程序输出如下:
E:\vs code\fortran> main.exe
At line 4 of file E:\vs code\fortran\demo.f90 (unit = 1, file = 'temp')
Fortran runtime error: End of file
Error termination. Backtrace:
问题原因:
使用open语句打开文件时,file的文件名应该带上文件后缀,否则打开的就是temp文件而不是temp.txt文件。
只需要补上文件后缀即可:
program main
integer x
open(1,file="temp.txt")
read(1,*) x
close(1)
print*, x
end program
10、子例行程序参数值异常
问题详情:
使用子例行程序时,在子例行程序运行之后的参数值与预期值不同,代码如下:
program main
real a,newa
read(*,*) a
write(*,*) "a=",a
call doublevalue(a,newa)
write(*,*) "newa=",newa
end program
subroutine doublevalue(x,newx)
write(*,*) "Now double the value of a."
newx=2*x
end subroutine
当输入10时,本来应该输出20,但是输出结果是一个随机值,如下:
E:\vs code\fortran> main.exe
10
a= 10.0000000
Now double the value of a.
newa= 2.80259693E-44
问题原因:
在子例行程序中使用参数之前要先声明参数才能使用,即将代码改成下面代码即可:
program main
real a,newa
read(*,*) a
write(*,*) "a=",a
call doublevalue(a,newa)
write(*,*) "newa=",newa
end program
subroutine doublevalue(x,newx)
real x,newx !先声明所使用的参数
write(*,*) "Now double the value of a."
newx=2*x
end subroutine