[Rd] operation on ‘numsels’ may be undefined

cstrato cstrato at aon.at
Mon Jun 23 20:54:38 CEST 2014


Dear Romain,

I do not know enough about compilers, but as far as I remember, they 
'work' from right to left, so numsels = ++numsels should not confuse the 
compiler. Anyhow I will change my code to your first suggestion since it 
is more elegant.

Best regards,
Christian


On 6/23/14 7:13 PM, Romain François wrote:
>
> Le 23 juin 2014 à 18:28, cstrato <cstrato at aon.at> a écrit :
>
>> Dear Romain,
>>
>> Thank you for your suggestions, I like especially the first one.
>>
>> However, you did not explain why I have never got this warning message on any compiler, and why only one of the two identical Ubuntu compilers did give this warning message?
>>
>> Best regards,
>> Christian
>
> I don’t know, but this:
>
> numsels = ++numsels ;
>
> seems fishy to me, and so it keeps feeling weird with the addition of the ternary operator.
>
> There is obviously a difference of setup between these two machines, but I don’t have time to sherlock that for you. One of the compilers is getting more careful than the other. Getting warnings you did not get before is a good thing, as it helps you update the code with that new insight.
>
> Welcome to my world, I’m sometimes thrown all kinds of new warnings from esoteric compilers, all of them have value .
>
> Romain
>
>> On 6/23/14 3:45 PM, Romain François wrote:
>>>
>>> Le 23 juin 2014 à 15:20, cstrato <cstrato at aon.at> a écrit :
>>>
>>>> Dear all,
>>>>
>>>> Since many years the following C++ code does compile on ALL Bioconductor servers (Linux, Windows, Mac) without any warnings:
>>>>
>>>>    Int_t numsels = 0;  //number of selected entries
>>>>    ...
>>>>    for (Int_t i=0; i<size; i++) {
>>>>       numsels = (arrMask[i] == 1) ? ++numsels : numsels;
>>>>    }//for_i
>>>
>>> This is confusing. I would write the loop body like this:
>>>
>>> numsels += (arrMask[i] == 1) ;
>>>
>>>
>>> or preferably using the STL:
>>>
>>> Int_t numsels = std::count( begin(arrMask), end(arrMask), 1 ) ;
>>>
>>> or some other variation of this, i.e. perhaps you don’t have a C++11 compiler, so perhaps one of these depending on what is arrMask:
>>>
>>> Int_t numsels = std::count( arrMask.begin(), arrMask.end(), 1 ) ;
>>> Int_t numsels = std::count( arrMask, arrMask + size, 1 ) ;
>>>
>>> Romain
>>>
>>>> Even on the recently added release server 'zin2' Linux (Ubuntu 12.04.4 LTS) the above code compiles w/o warnings.
>>>>
>>>> However, on the new development server 'zin1' Linux (Ubuntu 12.04.4 LTS) I get suddenly the following warning message:
>>>>
>>>> Found the following significant warnings:
>>>>   XPSPreProcessing.cxx:3026:56: warning: operation on ‘numsels’ may be undefined [-Wsequence-point]
>>>>
>>>> Interestingly, both servers do not only run the same version of Ubuntu, but also the same version of the C++ compiler, i.e. g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, and use the same flags, see:
>>>> http://bioconductor.org/checkResults/2.14/bioc-LATEST/zin2-NodeInfo.html
>>>> http://bioconductor.org/checkResults/devel/bioc-LATEST/zin1-NodeInfo.html
>>>>
>>>> My question is now, why do I suddenly get the compiler warning?
>>>>
>>>> The reason why I ask at R-devel and not Bioc-devel is that it may not only be a Bioc question, since I found the following links:
>>>> http://c-faq.com/expr/seqpoints.html
>>>> http://stackoverflow.com/questions/16838884/why-i-got-operation-may-be-undefined-in-statement-expression-in-c
>>>>
>>>> I am not sure if I understand the meaning, but until now I have never got any warning from any compiler the I have used (including MS Visual C++).
>>>>
>>>> Do I really have to replace '++numsels' with 'numsels+1'?
>>>>
>>>> Best regards,
>>>> Christian
>>>> _._._._._._._._._._._._._._._._._._
>>>> C.h.r.i.s.t.i.a.n   S.t.r.a.t.o.w.a
>>>> V.i.e.n.n.a           A.u.s.t.r.i.a
>>>> e.m.a.i.l:        cstrato at aon.at
>>>> _._._._._._._._._._._._._._._._._._
>>>>
>>>> ______________________________________________
>>>> R-devel at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>>
>
>



More information about the R-devel mailing list