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       */       
};                                                                                  

私が望むのは、ここで「Menuing System」として定義されている 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にさらに初期化がいくつかあり、必要に応じて喜んで提供します。私は1つになると確信しています。

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なので、誰かが私を助けるアイデアを持っているかもしれないと思います。いくつかの小さな変更を加えて、新しいリバイブを作成しようとしています。これは2つのうちの1つです。

助けてくれてありがとう。

4

1 に答える 1

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.
}
于 2013-10-23T23:37:26.843 に答える