Fortran编译传参报错:实参INTEGER(4)与形参REAL(4)类型不匹配
错误原因与修正方案
1. 核心错误:子过程/函数调用时参数顺序完全不匹配
你定义的Quicksort子过程的形参顺序为:
recursive subroutine QuickSort(A, n, lo, hi)
要求的传入顺序是「数组A → 数组长度n → 下界lo → 上界hi」,但你调用时的写法是:
call Quicksort(n, lo, hi, A(n))
- 实参顺序完全颠倒,把整型变量
n传给了要求实型数组的第一个形参A,这就是编译器报「INTEGER(4)转REAL(4)类型不匹配」的直接原因 - 你最后一个参数写的是
A(n),是数组的第n个元素,不是整个数组,即使顺序对也会报错
2. Partition函数调用的同样问题
Partition的形参顺序为:
function Partition(A, n, lo, hi) result(p)
你调用时的写法p = Partition(n, lo, hi, A(n))同样存在顺序颠倒、传单个元素而非整个数组的问题。
3. 其他逻辑错误
- 读文件时只读取了数组长度
n就关闭了文件,没有读取n个数值存入数组A - Partition函数中:
pivot被声明为整型,但它存储的是实型的数组元素值,类型错误- 索引
p初始值错误赋值为实型的A(lo),应该初始化为整型的lo - 索引
p的自增逻辑位置错误,应该放在匹配判断的分支内,而非循环全局位置
修正后的核心代码片段
主程序部分修正
! 补充读入数组元素的逻辑 open(42,file=fName) read(42,*) n allocate (A(n)) do i = 1, n read(42,*) A(i) enddo close(42) lo = 1 hi = n ! 修正调用参数顺序 call Quicksort(A, n, lo, hi)
Quicksort子过程修正
recursive subroutine QuickSort(A, n, lo, hi) implicit none integer :: lo, hi, p, partition, n real*4 :: A(n) if (lo < hi) then p = Partition(A, n, lo, hi) call Quicksort(A, n, lo, p-1) call Quicksort(A, n, p+1, hi) endif end subroutine QuickSort
Partition函数修正
function Partition(A, n, lo, hi) result(p) implicit none real*4 :: temp, A(n), pivot integer :: i, lo, hi, p, n pivot = A(hi) p = lo do i = lo, hi-1 if (A(i) .le. pivot) then temp = A(i) A(i) = A(p) A(p) = temp p = p + 1 endif end do temp = A(p) A(p) = A(hi) A(hi) = temp end function
补充规范建议
Fortran中如果子过程定义在主程序之后,建议在主程序的变量声明部分添加显式接口声明,避免编译器参数检查遗漏:
interface recursive subroutine QuickSort(A, n, lo, hi) integer, intent(in) :: n, lo, hi real*4, intent(inout) :: A(n) end subroutine QuickSort function Partition(A, n, lo, hi) result(p) integer, intent(in) :: n, lo, hi real*4, intent(inout) :: A(n) integer :: p end function Partition end interface
内容的提问来源于stack exchange,提问作者Nik Wrye
相关产品推荐
相关产品推荐

