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

From: oliver <oliver_at_first.in-berlin.de>
Date: Thu, 09 Jun 2011 17:15:04 +0200

On Thu, Jun 09, 2011 at 10:54:28AM -0400, Duncan Murdoch wrote:
> 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.
[...]

Ooops, yes. In the R-part. :-)
I did it, because when I don't get an int from the user's call, I have set it to NA (default in the R-function definition).

I made
  width <- as.integer(width)
for easy check inside the C-part, on integer.

(I really only need int, no floating point values.)

I thought this makes the C-code easier at that part.

Or I may check on NA inside the C-part.

How would I do that correctly?

After so much different opinions I read here, I'm rather puzzled on that now.

If there is already a R-extensions-FAQ I could collect the informations from the mail sof the last days, so that the different opinions and the discussion can result in a some answers...

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

It make sense for the picky.
As NULL is rather (void*)0 and a pointer is not an int (just can be coerced normally) ;)

Ciao,
  Oliver



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Thu 09 Jun 2011 - 15:21:36 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 - 17:20:17 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