[fpc-pascal] Proper preprocessor?

Marc Santhoff M.Santhoff at web.de
Thu Jun 21 22:19:34 CEST 2018


On Thu, 2018-06-21 at 22:25 +0700, Ryan Joseph wrote:
> > 
> I did a search and found only a few hits on the topic. Since I’ve been
> giving theoretical examples here’s something more practical a user
> attempted. Can you do that without macros? If I had to guess he had some
> funky code and just wanted to reduce typing and copy/paste bugs.
> 
> {$define HOFFSET(rec,field) := pointer(@rec.field) - pointer(@rec)} 

That funky code is the way some structured elements are defined when using
HDF5 file format library. It's pure C optimized for speed and my goal was to
adapt it to pascal. Using somesuch in C seems to be quite normal, it has an
entry in Wikipedia...

In the end I made the macro an inlined pascal function using the method of
"cruel casting"[tm]. After preprocessing C code should look similar.

<C>
#define HOFFSET(S,M)    (offsetof(S,M)) // offsetof is a standard define

H5Tinsert(s1_tid, "a_name", HOFFSET(s1_t, a), H5T_NATIVE_INT);
H5Tinsert(s1_tid, "c_name", HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
</C>

<Pascal>
function HOFFSETP(rectypevar: pointer; fieldvar: pointer): longint; inline;
begin
	HOFFSETP := longint(fieldvar - rectypevar);
end;

H5Tinsert(s2_tid, 'c_name', HOFFSETP(@s2[0], @s2[0].c), H5T_NATIVE_DOUBLE);
H5Tinsert(s2_tid, 'a_name', HOFFSETP(@s2[0], @s2[0].a), H5T_NATIVE_INT);
</Pascal>


> type 
>         s1_t = record 
>                 a: longint; 
>                 b: single; 
>                 c: double; 
>         end; 
> var 
>         s1: s1_t; 
> BEGIN 
>         s1.a := 12345; 
>         s1.b := 1.000000001; 
>         s1.c := 1.000000002; 
> 
>         writeln(HOFFSET(s1, a));
> END. 
> 
> Regards,
> 	Ryan Joseph
> 
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
-- 
Marc Santhoff <M.Santhoff at web.de>



More information about the fpc-pascal mailing list