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

From: oliver <oliver_at_first.in-berlin.de>
Date: Wed, 08 Jun 2011 18:08:39 +0200

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 modules).

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

  http://caml.inria.fr/pub/docs/manual-ocaml/libref/Pervasives.html

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.

Ciao,

   Oliver



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed 08 Jun 2011 - 16:18:01 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

All messages

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 09 Jun 2011 - 00:10:46 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive