[Rd] "warning: assignment discards qualifiers from pointer target type"
Prof Brian Ripley
ripley at stats.ox.ac.uk
Wed Jun 8 13:22:10 CEST 2011
On Tue, 7 Jun 2011, Duncan Murdoch wrote:
> On 07/06/2011 9:08 AM, oliver wrote:
>> Hello,
>>
>> following an advice here from the list I looked into sources of other
>> packages (xts) and found the TYPEOF() macro/function, which really is
>> helpful.
It is documented, of course, but actually better alternatives are
described in 'Writing R Extensions'.
We would urge you to study the R sources rather than copy bad habits
from randomly chosen package sources.
>> I iused the follwong code snippet:
>>
>>
>> switch( TYPEOF( filename_sexp ) )
>> {
>> case STRSXP: filename = CHAR( STRING_ELT(filename_sexp, 0) );
>> break;
>>
>> default: error("filename argument must be a string");
>> break;
>> }
>>
>>
>> Here, filename is of type char*
>> and one function opens a file with that name.
>> So it is purely intended to just grab out the char* from the
>> String-Expression.
>>
>> Am I doing something wrong here, or is it ok, but I have somehow
>> to say the extracting macros/functions, that it is really intended
>> to throw away information and that a warning is not necessary?
>
> The result of calling CHAR should be a "const char *". You are not allowed
> to touch the string it points to.
Note too that isString() exists for this purpose, and there is no
check in that code that LENGTH(filename_sexp) > 0 (or == 1). In the R
sources you will often see things like
if(!isString(sfile) || LENGTH(sfile) < 1)
error("invalid '%s' argument", "description");
Then, reading on,
file = translateChar(STRING_ELT(sfile, 0));
for you cannot (in general) assume that the character vector passed is
in the native encoding.
--
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