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

Simon Urbanek simon.urbanek at r-project.org
Thu Jun 9 18:56:09 CEST 2011


On Jun 9, 2011, at 11:15 AM, oliver wrote:

> 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 far you were creating the confusion, the facts are fairly simple if you have some clue about C and R. I would like to ask you to, please, read and understand C standard and R-exts *before* posting further questions since it's pointless if we provide answers that you don't understand. The fact that you are impatient (as you said yourself) doesn't entitle you to waste other people's time to explain things to you while you are unwilling to take the time yourself. If you have serious question beyond what is documented, feel free to ask, but make sure you have spent the time to think about it before you do so.


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

It's not - you're confusing NULL in R with NULL in C.
Both NILSXP and STRSXP are SEXP types - and obviously distinct ones. R will never return a null pointer for a SEXP.

Cheers,
Simon



More information about the R-devel mailing list