From chemistry-request@ccl.net Wed Dec 11 17:15:36 1991 Date: Wed, 11 Dec 91 16:04:44 CST From: shepard@dirac.tcg.anl.gov (Ron Shepard) To: chemistry@ccl.net Subject: FORTRAN vs. C Status: R For programmers interested in converting existing FORTRAN programs to C, there is a book entitled "From Fortran to C" by J. F. Kerrigan ISBN 0-8306-7661-9, which contains some useful information. It is organized by Fortran keyword, and in each section gives a C replacement for the Fortran construct. I cannot really recommend the book as a reference for going the other way, (i.e. for C programmers learning about Fortran) because most of the Fortran examples are not particularly well written. For example, (1) most of the format statements have hollerith strings in them (instead of the conceptually simpler, consistent, use of '-delimited character strings), (2) variables in common blocks are initialized in data statements (in f77 such initializations must be localized in block data subprograms), (3) named common blocks appear inconsistently in save statements (in f77 if a block is saved anywhere, it must be saved everywhere), and (4) the examples use fortran specific intrinsic functions (a bad programming practice; generic intrinsics should always be used when possible to enhance portability). Another general shortcoming of the book, particularly for scientific programmers, is that all of the correspondences between Fortran and C data types are based on a 16-bit microcomputer point of view. For example, C types "double" and "long double" are both mapped to Fortran "double precision" which in turn is associated in the text with "real*8". (No mention is made of fortran "real*16" which is supported on many machines as 128-bit floating point.) However, I think on a Cray, a C "double" maps to "real", which is really equivalent to either of the fortran declarations "real*4" or "real*8", and C "long double" maps to "double precision", which is really equivalent to "real*16". Maybe someone with more C experience on a Cray can correct this if I'm wrong. There is also some confusion introduced in the book when C "char" is identified with Fortran "character". In fact, the C "char" data type is really an integer data type. A better correspondence would be C "char" with the result of the fortran intrinsic ichar() operating on a character*1 argument. Character variables in Fortran are really structured entities, with the components of the structure hidden from the programmer (until cross-language calls are needed, at which time the actual structure must be dealt with explicitly). This applies to fortran character values of any length, whereas in C long strings are associated with char arrays. As far as I know, this is the only book available that is devoted to bridging the Fortran to C language gap. -ron shepard p.s. I know that nonprogrammers on this bboard may be getting bored with this discussion, but as long as useful information is being exchanged, I'm reluctant to encourage its termination. Bear with us and you'll eventually benefit from the superior code that we write. (:-)