常见的问题

返回首页

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后面不用加thenifelse 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