[Rd] How to store void* on 64 bit machines

Prof Brian Ripley ripley at stats.ox.ac.uk
Wed Mar 16 01:12:09 CET 2005


On Tue, 15 Mar 2005, Prof Brian Ripley wrote:

> On Tue, 15 Mar 2005, Vadim Ogranovich wrote:
>
>> I have an R class which represents a file stream (this is my custom
>> implementation of R I/O and has nothing to do with the standard R
>> connections). The class has a slot, called id, which is essentially a
>> void* pointer to a C++ stream object.
>> 
>> Up until now I worked on 32-bit machines and the id slot was an integer,
>
> If by `slot' you mean the slot in an S4 class, that is not correct.
> R has integer vectors, not integer scalars.
>
>> so one could cast back and forth between int and void*. However, on
>> 64-bits void* is castable to 'long int', but not int, which poses a
>> couple of problems:
>> a) since there is no R arrays of 'long int' type what other built-in
>> type can I use to store void*. For example double is big enough to
>> accommodate void*, but I am not sure whether casting will work both
>> ways.
>> 
>> b) assuming that a) is solvable, is there a solution which is portable
>> between 64 and 32 bit machines?
>
> The raw type can store anything: your pointer is just a stream of bytes.
> It could also be stored as one or two integers.

Depending what you want to do with this pointer and if there is only one 
of them, the externalptr type might be an even better match -- be careful 
about the non-copy-on-change semantics of that type.

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-devel mailing list