I ran f2c and successfully compiled the output C code. But, while attempting to read an input file the program aborts. Do you know why?
I’ve reduced the number of lines of code in these files to show the runtime error.
Background (f2c command):
/opt/src/f2c -Nn1604 fruit.f
File produced by running f2c:
#include "f2c.h"
struct {
integer npairs, iorange;
} orange_;
#define orange_1 orange_
integer c__9 = 9;
integer c__1 = 1;
integer c__20 = 20;
integer c__2 = 2;
integer c__3 = 3;
int MAIN__()
{
inlist ioin__1;
integer s_wsle(cilist *), do_lio(integer *, integer *, char *, ftnlen),
e_wsle(void), s_rsle(cilist *), e_rsle(void), f_inqu(inlist *);
int s_stop(char *, ftnlen);
logical ok;
integer iflg;
char ifile[32];
integer iunit;
extern int reveal_(integer *, char *, integer *, integer *, integer *, ftnlen);
cilist io___4 = { 0, 6, 0, 0, 0 };
cilist io___5 = { 0, 5, 0, 0, 0 };
cilist io___8 = { 0, 6, 0, 0, 0 };
cilist io___11 = { 1, 0, 0, 0, 0 };
cilist io___31 = { 0, 6, 0, 0, 0 };
s_wsle(&io___4);
do_lio(&c__9, &c__1, "Type the name of the input file to use" ":", (ftnlen)53);
e_wsle();
s_rsle(&io___5);
do_lio(&c__9, &c__1, ifile, (ftnlen)32);
e_rsle();
iunit = 1;
s_wsle(&io___8);
do_lio(&c__9, &c__1, " Taking Input", (ftnlen)19);
e_wsle();
ioin__1.inerr = 0;
ioin__1.infilen = 32;
ioin__1.infile = ifile;
ioin__1.inex = &ok;
ioin__1.inopen = 0;
ioin__1.innum = 0;
ioin__1.innamed = 0;
ioin__1.inname = 0;
ioin__1.inacc = 0;
ioin__1.inseq = 0;
ioin__1.indir = 0;
ioin__1.infmt = 0;
ioin__1.inform = 0;
ioin__1.inunf = 0;
ioin__1.inrecl = 0;
ioin__1.innrec = 0;
ioin__1.inblank = 0;
f_inqu(&ioin__1);
reveal_(&iunit, ifile, &c__20, &c__2, &iflg, (ftnlen)32);
io___11.ciunit = iunit;
(void) s_rsle(&io___11);
(void) do_lio(&c__3, &c__1, (char *)&orange_.npairs, (ftnlen)sizeof(integer));
s_wsle(&io___31);
return 0;
}
File f2c.h:
typedef long int integer;
typedef long int logical;
typedef long int flag;
typedef long int ftnlen;
typedef long int ftnint;
typedef long int ftnlen;
typedef struct
{ flag cierr;
ftnint ciunit;
flag ciend;
char *cifmt;
ftnint cirec;
} cilist;
typedef struct
{ flag inerr;
ftnint inunit;
char *infile;
ftnlen infilen;
ftnint *inex; /*parameters in standard's order*/
ftnint *inopen;
ftnint *innum;
ftnint *innamed;
char *inname;
ftnlen innamlen;
char *inacc;
ftnlen inacclen;
char *inseq;
ftnlen inseqlen;
char *indir;
ftnlen indirlen;
char *infmt;
ftnlen infmtlen;
char *inform;
ftnint informlen;
char *inunf;
ftnlen inunflen;
ftnint *inrecl;
ftnint *innrec;
char *inblank;
ftnlen inblanklen;
} inlist;
File reveal.f:
SUBROUTINE REVEAL(IUNIT,FILENAME,NUMC,OPERATINGSYS,FLAG)
IMPLICIT NONE
CHARACTER FILENAME*(*)
LOGICAL SUCCESS
INTEGER IUNIT,NUMC,OPERATINGSYS,FLAG
INQUIRE(FILE=FILENAME(1:NUMC),EXIST=SUCCESS)
OPEN(IUNIT,FILE=FILENAME(1:NUMC),STATUS='OLD',ERR=90)
GOTO 99
90 FLAG=1
C
99 RETURN
END
Makefile for reveal.f:
LIBRARY1 = ../library
FLAGS = -g -fPIC -std=legacy
.SUFFIXES : .o .f
.f.o:
gfortran $(FLAGS) -c $*.f
SOURCE = reveal.f
OBJECTFILES = $(SOURCE:.f=.o)
LIBRARY = $(LIBRARY1)/libraryreveal.a
LIBRARY: $(OBJECTF)
ar rvu $(LIBRARY) $(OBJECTFILES)
ranlib $(LIBRARY)
@echo "done"
Compilation of fruit.c with libraryreveal.a
cc -o fruit fruit.c ../library/libraryreveal.a -DLINUX -DSYSV -DNOHLA -g -Wall -Werror -fmax-errors=100 -lgfortran -lpthread -L/opt/libf2c -lf2c -lm
I’ve attached a screen dump showing a run in gdb.
Here’s the box input file:
1
1 38.608686 128.351871 0.003000 1 1 99999999 2.00000
1 1 2.000000 2.000000 80.000000 30.000000 2.000000