美好的一天,我想帮助改变这个C程序中的一小部分,我已经在90年代早期获得了许可。有些人可能熟悉它,它被称为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,有人可能有想法帮助我。我试图通过一些小的修改来创造一个新的复兴。这是两个中的一个。
感谢您的帮助。
答案 0 :(得分:0)
看起来descrp
中的struct module
字段期待char[]
(或字符串),并且您给它一个char *()
(函数返回一个字符串) )而不是。
也许你想要做的不是在mydescrp
的声明中调用module00
函数,而是在register_module
中手动执行检查:
int register_module(struct module *mod) {
if (strcmp(mod->descrp, "Menuing System") == 0) {
struct usrmnu *menu = mnuoff(usrnum);
// Copy as much of the title to the menu description as possible.
strncpy(mod->descrp, menu->mnuttl, MNMSIZ-1);
// Terminate the string in case the title was too long.
mod->descrp[MNMSIZ-1] = '\0';
}
// Rest of method.
}