2013-07-29 93 views
1

我正在將一大批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。 ,因爲他們應該。

+0

當您嘗試a.out cup

+0

它可能是CR與LF問題。在任何情況下,「這裏的文件」的語法值得失去睡眠?只要使用tmp文件表單即可。 – agentp

+0

@cup << XXX語法對從shell腳本到匹配XXX的管道線所說的話。基本上是一個內聯的外部文件。 (我使用過很多次,卻不知道它叫做「here document」..) – agentp

回答

1

IIRC g77運行時I/O庫在C stdio上實現,而GFortran I/O庫直接使用POSIX I/O apis並進行自己的緩衝。因此,C和Fortran緩衝區可能會出現不同步並且問題隨之而來。

另外,在一些GFortran版本中,在處理非可搜索文件時出現了一些錯誤。

通常,避免對同一文件執行混合語言I/O。不過,將C用於一個文件並將Fortran用於另一個文件是完全正確的。只是不要混合它們。