Fortran代码存在多处错误,请求技术排查与修正指导
Fortran代码错误修正方案
原代码里的问题逐一说明:
- 逻辑常量写法错误:Fortran里的真/假常量必须是
.true.和.false.,直接写true/false会被编译器当成未定义变量,这是核心报错原因。 - 函数声明错误:把自定义函数
fun用logical::p,q,fun声明成了普通逻辑变量,编译器无法识别它是函数,需改成external fun声明为外部函数,或用模块包裹函数(更规范)。 - 函数调用语法错误:有一行写了
function(true,true),属于无效写法,要改成调用fun(.true.,.true.)。 - print语句格式错误:好几行
print,"xxx"缺少*,应写成print*,"xxx",否则编译器会把引号内容当成格式控制符引发报错。
修正后的代码(外部函数写法,和原代码结构最接近)
Program mr implicit none logical::p,q external fun ! 声明fun是外部函数 read(*,*)p,q print*,"------" print*,"|p|q|p->q" print*,"------" print*,"|true|true|",fun(.true.,.true.),"|" print*,"------" print*,"|true|false|",fun(.true.,.false.),"|" print*,"------" print*,"|false|true|",fun(.false.,.true.),"|" print*,"------" print*,"|false|false|",fun(.false.,.false.),"|" print*,"------" end program mr logical function fun(p,q) logical::p,q if(p .eqv. .true. .and. q .eqv. .false.)then fun = .false. else fun = .true. end if end function fun
更规范的模块写法(推荐Fortran 90+使用)
模块写法能让编译器更好地检查参数类型,避免后续调用错误,代码结构更清晰:
module logic_funcs implicit none contains logical function fun(p,q) logical,intent(in)::p,q ! 逻辑蕴含p→q等价于 ¬(p∧¬q),直接写表达式更简洁 fun = .not. (p .and. .not. q) end function fun end module logic_funcs Program mr use logic_funcs ! 引入模块里的函数 implicit none logical::p,q read(*,*)p,q print*,"------" print*,"|p|q|p->q" print*,"------" print*,"|true|true|",fun(.true.,.true.),"|" print*,"------" print*,"|true|false|",fun(.true.,.false.),"|" print*,"------" print*,"|false|true|",fun(.false.,.true.),"|" print*,"------" print*,"|false|false|",fun(.false.,.false.),"|" print*,"------" end program mr
内容的提问来源于stack exchange,提问作者Sameh Ibn Al Malik
相关产品推荐
相关产品推荐

