gpt4 book ai didi

C代码setjmp声明函数?

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:18 24 4
gpt4 key购买 nike

我绝对不是编码员,但我正在尝试将一个非常古老的程序从 fortran 编译为 C,这样我就可以玩一个我已经 20 多年没玩过的游戏(最初是在 HP3000 上创建的)在 70 年代后期!)在我的 linux 机器上。

有人使用 f2c(fortran 到 C)编写了一个 make.sh 文件,以便它可以在 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 多年没有玩这个游戏了(!),所以如果能提供任何帮助,我将不胜感激。

最佳答案

这“只是”一个警告,函数调用没有任何参数,也没有检索任何返回值,所以这样写应该是安全的:

void mmsa_(void);
void mmsb_(void);
...

等等。

如果您有声明这些函数的头文件,那就更好了,因为您可以包含它们而不是直接声明它们。

当然你必须链接包含mmsa_代码和其他函数的库或对象,否则你会得到一个链接错误(问题会被转移到链接阶段)

顺便说一句:考虑重构您的代码以删除非常过时且容易出错的 K&R 旧式参数声明。

关于C代码setjmp声明函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51350455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com