更改Struct模块指针

时间:2013-10-23 22:28:41

标签: c pointers struct

美好的一天,我想帮助改变这个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,有人可能有想法帮助我。我试图通过一些小的修改来创造一个新的复兴。这是两个中的一个。

感谢您的帮助。

1 个答案:

答案 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.
}