Function FORTRAN 95在使用函数和函数中预期的形式参数列表时出错

Function FORTRAN 95在使用函数和函数中预期的形式参数列表时出错,function,compiler-errors,fortran,fortran95,Function,Compiler Errors,Fortran,Fortran95,我的代码可以工作,除非我试图使用函数计算数组中一组值的平均值。我省略了程序的大部分,因为如果不执行这些步骤,一切都会正常运行。谢谢大家! 在我的主程序中,我有 averagecalc=average(array(stepsize),stepsize) WRITE(*,*) averagecalc FUNCTION average(array(),stepsize) REAL,INTENT(IN),DIMENSION(stepsize)::array INTEGER,INTENT

我的代码可以工作,除非我试图使用函数计算数组中一组值的平均值。我省略了程序的大部分,因为如果不执行这些步骤,一切都会正常运行。谢谢大家!

在我的主程序中,我有

averagecalc=average(array(stepsize),stepsize)
WRITE(*,*) averagecalc
FUNCTION average(array(),stepsize)
    REAL,INTENT(IN),DIMENSION(stepsize)::array
    INTEGER,INTENT(IN)::stepsize
    average=SUM(array(stepsize))/stepsize
END FUNCTION
在我的主要课程之外,我有

averagecalc=average(array(stepsize),stepsize)
WRITE(*,*) averagecalc
FUNCTION average(array(),stepsize)
    REAL,INTENT(IN),DIMENSION(stepsize)::array
    INTEGER,INTENT(IN)::stepsize
    average=SUM(array(stepsize))/stepsize
END FUNCTION
我的全部课程是

程序子程序
隐式无
!变量
整数::i,步长,j,计数
字符::选择
实数,外部::函数,平均数
实数::a,函数1,函数2,函数3,x,上界,下界,平均值,和,平均值Calc
实数,可分配::数组(:)
!格式
101格式(A)!仅单个文本元素
102格式()!
!-------变量定义------!
!     整数:
!         i:用作柜台
!         步长:用户输入的步长数
!         j:用作计数器
!         计数:用于跟踪步骤
!
!     人物:
!         选择:
!     实际、外部:
!             功能:
!             平均值:
!     真实:
!
!
!
!
!
!
!
!
!
!
!----------------------------------!
!
!获取关于方程、边界和步长的信息
调用节1(下限、上限、步长、选项)
!根据选择计算公式,分配数组,写出数组
分配(数组(步长))
x=下界
计数=0
写(*,101)|-----------------------------------
写出(*,101)|步骤| x | f(x)|'
写(*,101)|-----------------------------------
i=1,步长
如果(选择等式'A'),则
数组(i)=函数1(x)
否则,如果(选择等式'B'),则
数组(i)=函数2(x)
否则,如果(选择等式'C'),则
数组(i)=函数3(x)
如果结束
计数=计数+1
写入(*,‘(I10,F10.3,F10.3)’计数,x,数组(i)
x=x+(上界下界)/步长
结束
!写平均数
averagecalc=平均值(数组(步长),步长)
写入(*,*)平均值计算
结束程序子程序
!------------------------------------------------第一节-------------------------------------------------
子例程第1节(下限、上限、步长、选项)
隐式无
真实,意图(外)::下界,上界
整数,意图(输出)::步长
角色、意图(外)::选择
101格式(A)!仅单个文本元素
102格式()!
写(*,101)“请用大写字母选择下列选项之一;”
写入(*,*)
写(*,101)“A)f(x)=x^2+2*x+4”
写入(*,*)
写(*,101)“B)f(x)=x+4”
写入(*,*)
写(*,101)'C)f(x)=sin(x)+42'
阅读(*,*)选项
如果(选择等式'A'),则
写入(*,*)
否则,如果(选择等式'B'),则
写入(*,*)
否则,如果(选择等式'C'),则
写入(*,*)
其他的
停止“请输入A、B或C”
如果结束
写(*,101)“请输入下限”
读(*,*)下标
写(*,101)“请输入上限”
读(*,*)上界
写(*,101)“请输入步长”
读取(*,*)步长
结束子程序第1节
!-------------------------------------------------------功能------------------------------------------
功能1(x)
真实意图(IN)::x
函数1=((x**2)+(2*x)+4)
端函数
功能2(x)
真实意图(IN)::x
功能2=防抱死制动系统(x+4)
端函数
功能3(x)
真实意图(IN)::x
函数3=sin(x)+42
端函数
!---------------------------------------平均值--------------------------
函数平均值(数组(),步长)
真实、意图(IN)、维度(步长)::数组
整数,意图(IN)::步长
平均值=总和(数组(步长))/步长
端函数

在这一行中,代码中至少有一个语法错误会阻止编译

FUNCTION average(array(),stepsize)
其中,
数组
后的空括号是不允许的。就我个人而言,我不会删除它们,我会像这样重写函数

real function average(array)
    real, dimension(:), intent(in) :: average
    average = sum(array)/size(array)
end function average
在现代Fortran中,将数组的大小作为单独的参数传递是不必要的,相反,正如您前面的问题所做的那样,这表明您从1979年开始通过虫洞发送问题

在构建源文件时,编译器无法检查传递给过程的参数是否与过程定义匹配。请遵循您已经提出的建议,将它们放入模块并使用关联它们,或者:

  • 将行
    结束程序子例程
    移动到源文件的末尾;及
  • 在移动该行的位置,插入
    包含的行
这两个步骤将允许编译器检查过程接口

最后,您的程序中有两个语义错误,一个严重,一个不太严重

首先,您有一个名为
stepsize
的变量,它的使用和描述清楚地表明这实际上是一系列步骤。您甚至会提示用户输入步长,但会将响应视为多个步骤。那是错误的

第二,您有一个名为
子程序的程序。什么

最后,这次我是认真的,如果你在这里进一步提问,我建议:

  • 如果你真的问了一个问题,你上面的帖子就不会问了
  • 如果您对无法编译的代码有疑问,请报告编译器发出的错误消息
  • 一般来说,虽然空白是一件好事,但在发布的代码片段中有很多空行,这只会让读者的任务更加繁重;在这个问题上,我看不到任何地方,如果不提高文章的可读性,多个空行不能被一个空行替换

您真正想要计算什么?错误是什么?使用现代Fortran,您最好将子程序和函数放在一个模块中,然后从主程序使用该模块。这样,编译器将“知道”如何调用子例程和函数。实际上,如果所有内容都在一个文件中,请将模块放在主程序之前。这里有一个例子:我想知道OP是否意味着“两个主要程序”r