Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!utgpu!water!watnot!watmath!clyde!rutgers!husc6!seismo!cmcl2!philabs!micomvax!musocs!mcgill-vision!mouse From: mouse@mcgill-vision.UUCP Newsgroups: comp.sys.ibm.pc,comp.lang.c Subject: Re: Segment & offset of pointers in MS C v4.0 Message-ID: <703@mcgill-vision.UUCP> Date: Mon, 23-Mar-87 18:56:13 EST Article-I.D.: mcgill-v.703 Posted: Mon Mar 23 18:56:13 1987 Date-Received: Fri, 27-Mar-87 05:42:00 EST References: <247@creed.tcom.stc.co.uk> Organization: McGill University, Montreal Lines: 22 Keywords: C pointers Xref: utgpu comp.sys.ibm.pc:2550 comp.lang.c:1330 In article <247@creed.tcom.stc.co.uk>, arden@creed.tcom.stc.co.uk (Bruce Arden) writes: > #define P_SEG(p) (unsigned)((long)( (char far *)(p) ) >> 16) > #define P_OFF(p) (unsigned)((long)( (char far *)(p) )) > This appeared to give the correct result (although it did generate > some redundant code) with data pointers. However it gave register DS > as the segment of a near code pointer. I don't know the particular compiler, but I'm not surprised. After all, you *are* casting it to a data pointer! Try something like #define CODEP_SEG(p) (unsigned)((long)( (int (far *)())(p) ) >> 16) #define CODEP_OFF(p) (unsigned)((long)( (int (far *)())(p) )) for code pointers. der Mouse Smart mailers: mouse@mcgill-vision.uucp USA: {ihnp4,decvax,akgua,utzoo,etc}!utcsri!musocs!mcgill-vision!mouse think!mosart!mcgill-vision!mouse ARPAnet: think!mosart!mcgill-vision!mouse@harvard.harvard.edu