home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #26 / NN_1992_26.iso / spool / comp / lang / c / 16217 < prev    next >
Encoding:
Text File  |  1992-11-09  |  2.3 KB  |  52 lines

  1. Newsgroups: comp.lang.c
  2. Path: sparky!uunet!news.tek.com!uw-beaver!cs.ubc.ca!destroyer!sol.ctr.columbia.edu!zaphod.mps.ohio-state.edu!saimiri.primate.wisc.edu!sdd.hp.com!decwrl!pa.dec.com!nntpd2.cxo.dec.com!nntpd.lkg.dec.com!ryn.mro4.dec.com!subsys.enet.dec.com!uyeno
  3. From: uyeno@subsys.enet.dec.com (Alice Uyeno)
  4. Subject: Re: need to create a jump table 
  5. Message-ID: <1992Nov9.144550.26183@ryn.mro4.dec.com>
  6. Lines: 39
  7. Sender: news@ryn.mro4.dec.com (USENET News System)
  8. Reply-To: uyeno@subsys.enet.dec.com (Alice Uyeno)
  9. Organization: Digital Equipment Corporation
  10. References: <1992Nov3.025210.27336@ryn.mro4.dec.com> <BxBq9L.4sM@portal.hq.videocart.com>
  11. Date: Mon, 9 Nov 1992 14:45:50 GMT
  12.  
  13.  
  14. I wasn't clear in my original note.
  15.  
  16. I have two callback tables.  Depending on a certain initialization flag, I use one or the other table, but the module that uses the call back table should not have knowledge of this flag.  This module only has a pointer to a callback table.  Unfortunately, all the routines do not take the same number of arguments.  
  17.  
  18. I have come to the conclusion that I cannot have a single jump table with functions with variable arguments.  After some discussion, I have decided to go ahead and embed arrays of pointers to functions within a structure.  The call back table pointer would just point to the correct structure.
  19.  
  20.   For example,
  21.  
  22.     
  23.       struct CallTbl
  24.        {
  25.            void (* Error)(ulong);
  26.            void (* Validate)(struct foo *);
  27.            int  (* CalcDiff)(struct foo2, usigned int, struct foo *);
  28.               .
  29.               .
  30.               .
  31.         }
  32.  
  33.        where Table 1 is
  34.              struct CallTbl Table1 = {Mod1_Error, Mod1_Validate, Mod1_CalcDiff,
  35.                                        .......);
  36.        and Table 2 is
  37.              struct CallTbl Table2 = (Mod2_Error, Mod2_Validate, Mod2_CalcDiff,
  38.                                         ......);
  39.  
  40.   and I use it as follows:
  41.  
  42.         
  43.          (*(TblPtr->Validate))(&Record);
  44.  
  45.     where  struct CallTbl * TblPtr  and   struct foo Record
  46.  
  47.  
  48. I'll go ahead and do this unless someone has any better ideas.
  49.  
  50. My other choice was to have to look at this initialization flag whenever a call back had to be made, but then this would violate the fact that the module is not supposed to know the value of the flag.
  51.             
  52.