0

大家好,我需要一些帮助来更改我在 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,所以有人可能有一个想法来帮助我。我正在尝试通过一些小的修改来创造一个新的复兴。这是其中之一。

谢谢你的帮助。

4

1 回答 1

0

看起来descrpin 中的字段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.
}
于 2013-10-23T23:37:26.843 回答