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

Duncan Murdoch murdoch.duncan at gmail.com
Thu Jun 9 16:54:28 CEST 2011


On 09/06/2011 9:28 AM, oliver wrote:
> On Thu, Jun 09, 2011 at 07:43:20AM -0400, Duncan Murdoch wrote:
> >  On 11-06-09 7:27 AM, oliver wrote:
> >  >On Wed, Jun 08, 2011 at 08:35:34PM -0400, Simon Urbanek wrote:
> >  >>
> >  >>On Jun 8, 2011, at 8:32 PM, oliver wrote:
> >  >>
> >  >>>On Thu, Jun 09, 2011 at 02:17:31AM +0200, oliver wrote:
> >  >>>[...]
> >  >>>>OK, I looked at this now.
> >  >>>>
> >  >>>>LENGTH() checks the length of the vector.
> >  >>>>
> >  >>>>Good to know this.
> >  >>>>
> >  >>>>So the problem of a vector of length 0 can be with any arguments of type SEXP,
> >  >>>>hence I will need to check ANY arg on it's length.
> >  >>>>
> >  >>>>This is vital to stability under any situation.
> >  >>>>
> >  >>>>Thanks for this valuable hint!
> >  >>>>
> >  >>>>I will add checks for all my SEXP-args.
> >  >>>[...]
> >  >>>
> >  >>>Hey, LENGTH() does not work with String-vectors! :(
> >  >>>
> >  >>
> >  >>Of course it does ...
> >  >>
> >  >>
> >  >
> >  >It does not so on my R 2.10.1 installation.
> >  >
> >  >
> >  >In the R-Shell I get:
> >  >
> >  >    ==============================
> >  >    >   length(c())
> >  >    [1] 0
> >  >    >
> >  >    ==============================
> >  >
> >  >So c() is vec of length 0.
> >  >
> >  >When I feed my readjpeg() with c() as filename arg,
> >  >
> >  >testing with:
> >  >====================================================
> >  >    if( LENGTH( filename_sexp )<   1 )
> >  >    {
> >  >      error("LENGTH( filename_sexp )<   1");
> >  >      //error("filename can't be vector of length 0");
> >  >    }
> >  >    else
> >  >    {
> >  >      error("LENGTH( filename_sexp ) is not<   1");
> >  >    }
> >  >====================================================
> >  >
> >  >
> >  >I got:
> >  >    Error in readjpeg(filename = c()) : LENGTH( filename_sexp ) is not<   1
> >  >
> >  >
> >  >You can explain why?
> >
> >  c() doesn't create a STRSXP, it is NULL, which is a NILSXP.
> >  LENGTH() doesn't work on that object.  (I'd recommend using length()
> >  rather than LENGTH(); it's a function, not a macro, and it does give
> >  the expected answer.)
> [...]
>
> Interestingly, c() as value for an integer value
> can be testes correctly with LENGTH().

Presumably you converted it to an INTSXP.  c() is NULL.

> So the question arises: is c() always creating NILSXP,
> or is it NILSXP only for STRSXP, and 0 otherwise?

That question makes no sense at all.

Duncan Murdoch

> NILSXP, as it might be close to a NULL might be interpreted as 0
> length by LENGTH...
>
> Nevertheless it's a littlebid confusing for people who don't know the
> internals of R.
>
> Will try length() soon.
>
> Ciao,
>     Oliver
>
>
>
> P.S.: To be picky: NOT knowing the internals and nevertheless using the available
>        functions/macros is called encapsulation in OO or the difference between
>        interface and implementation... which is good style of programming.
>



More information about the R-devel mailing list