【问题标题】:fortran and c reading "here document"fortran 和 c 阅读“这里的文档”
【发布时间】:2013-07-29 16:43:25
【问题描述】:

我正在将大量 f77 程序移植到一个新系统,编译 gfortran 而不是 g77。其中一些程序同时使用 Fortran 读取 语句,以及从标准输入读取的(自定义)C 例程。这 如果程序以交互方式运行,则工作正常,但如果 交互式输入作为一个单独的文件提供,该文件通过管道传送到 程序,或作为此处的文档。对于最后两种情况,如果 Fortran read 后跟一个 C getchar,getchar 返回 EOF 而不是 文件的未读部分。

将 Fortran 读取替换为调用 fget 可以解决以下问题 管道输入,但不适用于此处的文档。

所有这些都使用 sh shell,在 Mac OS X 10.8.4 上; gfortran 是 gcc 4.6.2 C 的 gcc 是 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

输出是(文件传输时的前四行,第二行 当它是一个here文档时设置):

 *
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
  • 这可能是 CR 与 LF 的问题。无论如何,“这里的文档”语法值得失眠吗?如果可行,只需使用 tmp 文件形式即可。
  • @cup
  • 好的,明白了:当您从脚本输入时,它会失败,而当您从模拟控制台输入的管道输入时,它会起作用。这可能与缓冲和非缓冲输入有关,因为您使用的是两个独立的输入系统。在某些 C 编译器上,将 getc 与 scanf 混合也会产生类似的问题。

标签: gcc fortran sh heredoc


【解决方案1】:

IIRC g77 运行时 I/O 库是在 C stdio 之上实现的,而 GFortran I/O 库直接使用 POSIX I/O api 并进行自己的缓冲。因此,C 和 Fortran 缓冲区很可能不同步,从而出现问题。

此外,在某些 GFortran 版本中,在处理不可搜索文件方面存在错误。

一般来说,避免对同一文件执行混合语言 I/O。不过,将 C 用于一个文件而将 Fortran 用于另一个文件是完全可以的。只是不要混合它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多