From ripley at stats.ox.ac.uk  Sat Sep 29 08:12:49 2007
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Sat, 29 Sep 2007 07:12:49 +0100 (BST)
Subject: [Rd] CHAR () and Rmpi
In-Reply-To: <65368.65.95.138.11.1191005668.squirrel@www.stats.uwo.ca>
References: <65368.65.95.138.11.1191005668.squirrel@www.stats.uwo.ca>
Message-ID: <Pine.LNX.4.64.0709290655440.19554@gannet.stats.ox.ac.uk>

I'm not sure what your sticking point here is.  If mpi does not modify 
data in a (char *) pointer, then that really is a (const char *) pointer 
and the headers are being unhelpful in not telling the compiler that 
the data are constant.

If that is the case you need to use casts to (char *) and the following 
private define may be useful to you:

#define CHAR_RW(x) ((char *) CHAR(x))


However, you ask

> Is there an easy way to get a char pointer to STRING_ELT((sexp_rdata),0) 
> and is also backward compatible to old R versions.

and the answer is that there is no such way, since (const char *) and 
(char *) are not the same thing and any package that wants to alter the 
contents of a string element needs to create a new CHARSXP to be that 
element.


BTW, you still have not changed Rmpi to remove the configure problems on 
64-bit systems (including assuming libs are in /usr/lib not /usr/lib64) I 
pointed out a long time ago.


On Fri, 28 Sep 2007, Hao Yu wrote:

> Hi. I am the maintainer of Rmpi package. Now I have a problem regarding
> the change of CHAR () in R 2.6.0. According to R 2.6.0 NEWS:
> *******
> CHAR() now returns (const char *) since CHARSXPs should no
>        longer be modified in place.  This change allows compilers to
>        warn or error about improper modification.  Thanks to Herve
>        Pages for the suggestion.
> *******
> Unfortunately this causes Rmpi to fail since MPI requires char pointers
> rather than const char pointers. Normally I use
>    CHAR(STRING_ELT((sexp_rdata),0))
> to get the pointer to MPI where a R character vector (C sense) is stored.
> Because of the change, all character messengers fail. Is there an easy way
> to get a char pointer to STRING_ELT((sexp_rdata),0) and is also backward
> compatible to old R versions. BTW Rmpi does not do any modification of
> characters at C level.
>
> Thanks
> Hao Yu
>
>

-- 
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



[Rd] CHAR () and Rmpi
Prof Brian Ripley