When I compile the following file with f2c
, it fails with a noninformative syntax error message
f2c < ../../libcruft/blas-xtra/ddot3.f >ddot3.c
ddot3:
Error on line 37: syntax error
gfortran
compiles it without any error. Do you have an idea what can cause it? Do you know of any fortran compiler that would be strict as f2c
and have good error messages?
The file in question:
c Copyright (C) 2009-2012 VZLU Prague, a.s., Czech Republic
c
c Author: Jaroslav Hajek <[email protected]>
c
c This file is part of Octave.
c
c Octave is free software; you can redistribute it and/or modify
c it under the terms of the GNU General Public License as published by
c the Free Software Foundation; either version 3 of the License, or
c (at your option) any later version.
c
c This program is distributed in the hope that it will be useful,
c but WITHOUT ANY WARRANTY; without even the implied warranty of
c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c GNU General Public License for more details.
c
c You should have received a copy of the GNU General Public License
c along with this software; see the file COPYING. If not, see
c <http://www.gnu.org/licenses/>.
c
subroutine ddot3(m,n,k,a,b,c)
c purpose: a 3-dimensional dot product.
c c = sum (a .* b, 2), where a and b are 3d arrays.
c arguments:
c m,n,k (in) the dimensions of a and b
c a,b (in) double prec. input arrays of size (m,k,n)
c c (out) double prec. output array, size (m,n)
integer m,n,k,i,j,l
double precision a(m,k,n),b(m,k,n)
double precision c(m,n)
double precision ddot
external ddot
c quick return if possible.
if (m <= 0 .or. n <= 0) return
if (m == 1) then
c the column-major case.
do j = 1,n
c(1,j) = ddot(k,a(1,1,j),1,b(1,1,j),1)
end do
else
c We prefer performance here, because that's what we generally
c do by default in reduction functions. Besides, the accuracy
c of xDOT is questionable. Hence, do a cache-aligned nested loop.
do j = 1,n
do i = 1,m
c(i,j) = 0d0
end do
do l = 1,k
do i = 1,m
c(i,j) = c(i,j) + a(i,l,j)*b(i,l,j)
end do
end do
end do
end if
end subroutine
I believe that f2c
expects to read FORTRAN77 and the line
if (m <= 0 .or. n <= 0) return
uses a token (ie <=
) that was introduced in Fortran 90. Try changing the line to
if (m .le. 0 .or. n .le. 0) return
I expect that if this fixes the problem f2c
will next complain about ==
which is also a Fortran 90 introduction.
Do not read on if you are a fan of f2c
.
As for Do you know of any fortran compiler that would be strict as f2c and have good error messages? you're joking right ? f2c
is an outdated pile of insert your favourite term of moderate-to-severe disapproval here which was probably a bad idea back in 1990 when it was first published. Now that interoperability between Fortran and C is (a) standardised and (b) easier than ever before I see no good reason for using it.