我正在將一大批f77程序移植到一個新系統中,編譯時使用gfortran而不是g77編譯爲 。其中一些程序既使用Fortran讀取 語句,又使用(自定義)C例程從標準輸入中讀取。如果程序以交互方式運行,則此 可以正常工作,但如果將 交互式輸入作爲單獨文件提供給 程序或作爲here文檔提供,則此功能不起作用。對於最後兩種情況,如果Fortran 讀取後面跟着一個C getchar,則getchar將返回EOF,而不是文件的未讀部分 。fortran和c閱讀「here文檔」
用fget調用替換Fortran讀取可以解決 管道輸入的問題,但不能解決here文檔中的問題。
所有這些在Mac OS X 10.8.4上使用sh shell, gfortran是gcc 4.6.2 和gcc for C是蘋果版本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。 ,因爲他們應該。
當您嘗試a.out
cup
它可能是CR與LF問題。在任何情況下,「這裏的文件」的語法值得失去睡眠?只要使用tmp文件表單即可。 – agentp
@cup << XXX語法對從shell腳本到匹配XXX的管道線所說的話。基本上是一個內聯的外部文件。 (我使用過很多次,卻不知道它叫做「here document」..) – agentp