大家好,我需要一些帮助来更改我在 90 年代初获得许可的 C 程序中的一小部分。有些人可能对它很熟悉,它被称为 MajorBBS 并且您可能已经猜到它是 bbs 软件。
在头文件 majorbbs.h 我们有
extern
struct module { /* module interface block */
char descrp[MNMSIZ]; /* description for main menu */
int (*lonrou)(); /* user logon supplemental routine */
int (*sttrou)(); /* input routine if selected */
void (*stsrou)(); /* status-input routine if selected */
int (*injrou)(); /* "injoth" routine for this module */
int (*lofrou)(); /* user logoff supplemental routine */
void (*huprou)(); /* hangup (lost carrier) routine */
void (*mcurou)(); /* midnight cleanup routine */
void (*dlarou)(); /* delete-account routine */
void (*finrou)(); /* finish-up (sys shutdown) routine */
} **module;
同样在majorbbs.h中,我们有一些定义菜单变量的代码
extern
struct usrmnu { /* user's menuing-specific variables */
char curpag[PNMSIZ]; /* current menu page */
char parpag[PNMSIZ]; /* parent menu page */
char selchrs[MAXSEL]; /* select characters currently available */
char pages[MAXSEL][PNMSIZ]; /* pages or file names for select chars */
char optdsp[MAXSEL]; /* instructions on how to display options */
int keyreq[MAXSEL]; /* key required for each select character */
FILE *fp; /* pointer to file currently being viewed */
char mnuttl[TITLSZ]; /* menu page title */
} *mnuusr;
然后在majorbbs.c文件中我们有
struct module module00={ /* module interface block */
"Menuing System", /* description for main menu */
NULL, /* user logon supplemental routine */
mainu, /* input routine if selected */
musthn, /* status-input routine if selected */
NULL, /* "injoth" routine for this module */
NULL, /* user logoff supplemental routine */
loscar, /* hangup (lost carrier) routine */
midnit, /* midnight cleanup routine */
NULL, /* delete-account routine */
mjrfin /* finish-up (sys shutdown) routine */
};
我想要的是将此处定义为“菜单系统”的 descrp 的值更改为更动态的值,例如用户当前所在的菜单。
从这里的代码中,我认为它是 mnuusr->curpag ,这是我认为指针指向的位置。
所以我在想一个例程。我绝不是程序员,我去过很多网站来寻找如何做这样的事情的例子。最近几天我在这里搜索过(在发布之前)。我看到了一些引发“嘿,这可能有效”的事情,但我最终遇到了编译器错误(稍后会详细介绍)
我所做的就是制定一个例行程序
char *
mydescrp
{
if (strcmp(module00.descrp,"Menuing System" ) == 0 ) {
mnuusr=mnuoff(usrnum);
return(mnuusr->mnuttl);
}
}
然后,如果我将上面的 module00 调用更改为
struct module module00={
mydescrp, /* My change */
NULL,
mainu,
musthn,
NULL,
NULL,
loscar,
midnit,
NULL,
mjrfin
};
当我编译时,我得到一些错误,上面写着:
初始化未完全括起来
名单从那里开始。稍后在majorbbs.c 中有一些进一步的初始化,如果您需要,我们很乐意提供它们。我相信一定会的。
int
register_module( /* register a module for online use */
struct module *mod) /* pointer to a module block */
{
if (strlen(mod->descrp) > MNMSIZ-1) {
catastro("MODULE NAME \"%s\" TOO LONG!",mod->descrp);
}
if (mod->stsrou == NULL) {
mod->stsrou=dfsthn;
}
if (nmods == 0) {
module=(struct module **)alcmem(sizeof(struct module *));
mdstats=(struct mdstats *)alcmem(sizeof(struct mdstats));
}
else {
module=(struct module **)alcrsz(module,sizeof(struct module *)*nmods,
sizeof(struct module *)*(nmods+1));
mdstats=(struct mdstats *)alcrsz(mdstats,sizeof(struct mdstats)*nmods,
sizeof(struct mdstats)*(nmods+1));
}
module[nmods]=mod;
setbtv(mstbb);
if (qeqbtv(mod->descrp,0)) {
gcrbtv(&mdstats[nmods],0);
}
else {
setmem(&mdstats[nmods],sizeof(struct mdstats),0);
strcpy(mdstats[nmods].mdname,mod->descrp);
}
rstbtv();
return(nmods++);
}
来自 MENUING.C mnuoff 例程
struct usrmnu *
mnuoff( /* get pointer to user's menu info */
int unum) /* user number to grab */
{
#ifdef PHARLAP
return((struct usrmnu *)((long)(eclmnubas+(unum<<3))<<16));
#else
#ifdef ECLIPSE
return((struct usrmnu *)((long)(eclmnubas+(unum<<3))<<16));
#else
return((struct usrmnu *)(muusrs+(unum*(long)sizeof(struct usrmnu))));
#endif
#endif
}
这是为一些新代码更改的例程吗?我只是不知道该怎么做。如果您需要更多代码,请告诉我。
我什至在usenet 上向其他majorbbs 程序员寻求帮助,但这个软件已经有20 年以上的历史了,所以我认为没有人再使用它了,更不用说修改代码了。我想,因为它仍然是 C,所以有人可能有一个想法来帮助我。我正在尝试通过一些小的修改来创造一个新的复兴。这是其中之一。
谢谢你的帮助。