Consider our norm example. The main program knows that norm2 is an external function that returns a real value, but it has no information about the arguments.
Special problems arise when procedures call each other; the caller has very limited knowledge on the called procedure; it passes a list of actual argument addresses to the called procedure; the called procedure retrieves this addresses in order, and assumes they are the addresses of the formal (dummy) arguments.
The disadvantage of this approach is that the compiler is able to perform only limited consistency checks. In F77, it is easy to make mistakes undetectable by the compiler when working with argument lists.
Consider, for example, the following subroutine
real function pow(x,n) !assume n >= 1 implicit none real::x integer::n,i print*,'Args: X=',x,' N= ',n pow=x do i=2,n pow=pow*x end do end function pow program powtest implicit none real::x=2.0 integer::n=3 real,external::pow print*,'pow= ',pow(x,n) print*,' wrong pow= ',pow(n,x) !mistake: we flipped the !arguments around. end program powtest
The accidental switch of arguments cannot be detected by the compiler and produces most curious results.