[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
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
More information about the R-devel
mailing list