> > ffkey_(key,ptr,Nvar,type,strlen(key),strlen(type));
>
> Is this the way to call fortran subroutine ffkey_ (in FFREAD
> package) --
> adding 2 more arguments strlen(key), strlen(type) in the call? I
> understand fortran would require this info, but is the order
> implementation-independent?
Not it is not. This order is defined by platform/vendor/compiler.
For example for Digital Visual Fortran on Windows platform one
needs:
FFKEY(key,strlen(key),ptr,Nvar,type,strlen(type));
where one has to supply the prototype for that FFKEY as follows:
extern "C" {
void _stdcall FFKEY(char *, int key, void *,int *,char *,int);
}
An attempt to take in account all possible combination was done by
the author of CFortran package.
/* cfortran.h 3.9 */ /* anonymous ftp@zebra.desy.de */
/* Burkhard Burow burow@desy.de 1990 - 1997. */
Most of the CERNLIB entries have been defined with this packages and
available from CERN:
Directory of asis\share\cern\98\src\cfortran
27.06.98 18:37 <DIR> .
27.03.98 05:55 <DIR> ..
27.06.98 18:37 <DIR> CVS
27.01.98 12:16 106'698 cfortran.h
06.03.98 05:20 21'636 hbook.h
15.05.96 05:24 218'721 geant315.h
15.05.96 05:24 254'092 geant321.h
30.01.98 11:10 92'069 gen.h
30.01.98 11:10 10'296 higz.h
30.01.98 11:10 6'275 hplot.h
30.01.98 11:10 13'403 jetset74.h
24.03.98 08:46 79'257 kernlib.h
30.01.98 11:10 6'420 lepto62.h
30.01.98 11:10 8'444 minuit.h
29.01.98 12:59 76 packlib.h
05.02.98 12:47 <DIR> Examples
29.01.98 05:49 37 graflib.h
30.01.98 11:10 272 kuip.h
30.01.98 11:10 198 zebra.h
30.01.98 11:48 342 Imakefile
26.06.98 11:43 96'063 cfortran.doc
For more simple case the following "include" may help as well:
fortranc.h:
==========
#ifndef FORTRANC_DEF
#define FORTRANC_DEF
#ifdef WIN32
# ifdef CERNLIB_MSSTDCALL
# define F77_UCASE
# define type_of_call _stdcall
# ifndef CERNLIB_QXCAPT
# define CERNLIB_QXCAPT
# endif
# else
# define F77_LCASE
# ifndef CERNLIB_QXNO_SC
# define CERNLIB_QXNO_SC
# endif
# endif
#endif
#ifdef CERNLIB_QXCAPT
# define F77_NAME(name,NAME) NAME
#else
# if defined(CERNLIB_QXNO_SC)
# define F77_NAME(name,NAME) name
# else
# define F77_NAME(name,NAME) name##_
# endif
#endif
#ifndef type_of_call
# define type_of_call
#endif
#endif
================
Now one can use it as follows:
#include "fortranc.h"
#define ffkey_ F77_NAME(ffkey,FFKEY)
extern "C" {
void type_of_call ffkey_(char *, int key, void *,int *,char *,int);
}
#ifdef WIN32
FFKEY(key,strlen(key),ptr,Nvar,type,strlen(type));
#else
FFKEY(key,ptr,Nvar,type,strlen(type),strlen(key));
#endif
Hope this helps,
Valery
=================================================================
Dr. Valeri Faine (Fine)
------------------- Phone: +1 516 344 7806
Brookhaven National Laboratory FAX : +1 516 344 4206
Bldg. 510A /STAR mailto:fine@bnl.gov
Upton, New York, 11973-5000 http://nicewww.cern.ch/~fine
USA
Dr. Valery Fine Telex : 911621 dubna su
-----------
LCTA/Joint Inst.for Nuclear Res. Phone : +7 09621 6 40 80
141980 Dubna, Moscow region Fax : +7 09621 6 51 45
Russia mailto:fine@main1.jinr.dubna.su