[Rd] "warning: assignment discards qualifiers from pointer target type"

oliver oliver at first.in-berlin.de
Wed Jun 8 18:08:39 CEST 2011

On Wed, Jun 08, 2011 at 12:22:10PM +0100, Prof Brian Ripley wrote:
> 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.

Hmhh, it was not randomly chosen, it was, what I got as a hint here on the list.

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

OK, I also sometimes used that (maybe I threw it out or used it in other

> 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");

If it's a vector, I can just pic the first element.
Or does   LENGTH(sfile)  give the length of the string itself
(like strlen(3))?

If the latter, then my file-opeing operation would faile with an error.
Of course I check if my fopen() gibves back NULL.

> Then, reading on,
>     file = translateChar(STRING_ELT(sfile, 0));

translateChar is explained on page 120 of the extension writing do.

I'm not in this point of the documentation.

And I often need to look around, when I want to find a function,
as they are documented/explained somewhere during the flow of the text.

Something like a API description that is brief would help.

For example something like in the manuals of the OCaml language:


That's very brief.

Chapter 6 of the  "Writing R Extensions" is rather in this style
and gives a good overview.
Something like that for the macros would be helpful.

> for you cannot (in general) assume that the character vector passed
> is in the native encoding.

I try to do some coercions (e.g. as.integer())
when I need integer in the C-code and then
in the C-part rigidly check on integer.

About the char-encodings I have not thought much.


More information about the R-devel mailing list