我正在将一大组f77程序移植到新系统中,并使用 gfortran而不是g77。其中一些程序同时使用Fortran读取 语句和从标准输入读取的(自定义)C例程。这个 如果程序以交互方式运行,则可以正常工作,但如果是,则无效 交互式输入作为一个单独的文件提供,通过管道输送到 程序,或作为此处的文档。对于最后两种情况,如果是Fortran read后跟一个C getchar,getchar返回EOF而不是 未读的文件部分。
通过调用fget替换Fortran读取解决了问题 管道输入,但不适用于此处的文档。
所有这些都使用sh shell,在Mac OS X 10.8.4上; gfortran是gcc 4.6.2 而gcc for C是Apple版本,4.2.1(我打算用它来重试 一致的gcc但目前不能)。
任何人都知道原因或解决方案吗?
这是一个创建和编译两个程序的脚本,并进行演示 问题:
#!/bin/sh
cat << XXX > tmp.f
character*1 sym,dum
call fget(sym)
write(6,*) sym
call tmpc
stop
end
XXX
cat << XXX > tmpc.c
#include <stdio.h>
#include <ctype.h>
float tmpc_()
{
int c;
c=getchar();
fprintf(stderr,"1. c is %o %d\n",c,c);
c=getchar();
fprintf(stderr,"2. c is %o %d\n",c,c);
c=getchar();
fprintf(stderr,"3. c is %o %d\n",c,c);
fprintf(stderr,"\n");
return(0);
}
XXX
gcc -c tmpc.c
gfortran tmp.f tmpc.o
cat << XXX > tmp
*
2.34 12
XXX
cat tmp | a.out
a.out << XXX
*
2.34 12
XXX
rm tmp.f a.out tmpc.c tmpc.o tmp
输出是(文件管道时的前四行,第二行 当它是这里的文件时设置):
*
1. c is 12 10
2. c is 62 50
3. c is 56 46
*
1. c is 37777777777 -1
2. c is 37777777777 -1
3. c is 37777777777 -1
第一组是正确的:c的值对应于字符 \ n 2。 他们应该这样做。
答案 0 :(得分:1)
IIRC g77运行时I / O库是在C stdio之上实现的,而GFortran I / O库直接使用POSIX I / O apis并进行自己的缓冲。因此,C和Fortran缓冲区很可能会失去同步,然后出现问题。
此外,在一些GFortran版本中,处理不可搜索文件时存在错误。
通常,避免对同一文件执行混合语言I / O.但是,将C用于一个文件并将Fortran用于另一个文件是完全可以的。只是不要混淆它们。