【发布时间】:2018-07-15 17:11:26
【问题描述】:
我绝对不是程序员,但我正在尝试让一个非常古老的程序从 fortran 编译到 C,这样我就可以玩一个我 20 多年没玩过的游戏(最初是在 HP3000 上创建的在 70 年代后期!)在我的 linux 机器上。
有人编写了一个 make.sh 文件,使用 f2c(fortran 到 C),以便它可以在 linux 下使用 GCC 进行编译,但这是很久以前完成的。
我收到以下错误消息:
stubs.c: In function ‘exexc_’:
stubs.c:76:13: warning: implicit declaration of function ‘mmsa_’; did
you mean ‘memset’? [-Wimplicit-function-declaration]
case 'A': mmsa_(); break;
stubs.c 中的相关代码,即 exexc 函数是:
#include <setjmp.h>
int setjmp(jmp_buf env);
void exexc_(name, i1, i2, i3, i4, i5, namelen)
char *name;
shortint *i1, *i2, *i3, *i4, *i5;
long namelen;
{
static jmp_buf env;
static int first = 1;
static char segment[6];
ipx[0] = *i1;
ipx[1] = *i2;
ipx[2] = *i3;
ipx[3] = *i4;
ipx[4] = *i5;
strncpy(segment, name, namelen);
if( ! first ) longjmp(env, 1);
if( first )
{
first = 0;
setjmp(env);
switch(segment[3]) {
case 'A': mmsa_(); break;
case 'B': mmsb_(); break;
case 'C': mmsc_(); break;
case 'D': mmsd_(); break;
case 'E': mmse_(); break;
case 'F': mmsf_(); break;
case 'G': mmsg_(); break;
case 'H': mmsh_(); break;
case 'I': mmsi_(); break;
case 'J': mmsj_(); break;
case 'K': mmsk_(); break;
case 'L': mmsl_(); break;
default:
fprintf(stderr, "Whoa, attempted to call segment %s\n", segment);
fflush(stderr);
exit(1);
}
fprintf(stderr, "Oops, segment %s didn't call next segment\n", segment);
fflush(stderr);
exit(2);
}
}
我需要在 stubs.c 文件中进行哪些更改,以便声明 'case 'A': mmsa_()' 函数?如果有帮助,那么 mmsa 指的是我认为 mmsa.c 在同一本地目录中的另一个文件。
如果您需要,很乐意提供更多信息。我已经 20 多年没有玩过这个游戏了(!),所以任何帮助都将不胜感激。
【问题讨论】:
-
如果您有
mmsxxx函数的代码,则必须声明它们:void mmsa_();或包含相关的 .h 文件(如果存在)。 -
这不是错误信息;这只是一个警告。
-
非常感谢大家 :) 现在可以正确编译了 :)
-
在 C89 模式下构建(
-ansi切换 gcc),您可以禁用或忽略警告 -
为什么不直接安装 Fortran 编译器并使用原始代码?