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 <cstr...@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 <cstr...@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@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel