Dear Kasper, What do you mean with 'undefined aspect of ++'?
Every compiler has to evaluate first the expression on the right side and then apply the result to the variable on the left side, as in:
i = i + 1; I understand that the expression: i = i++; may be confusing, but the expression: i = ++i; should work. What about: i = (++i); or i = {++i} Would this also result in a warning message? Best regards, Christian On 6/23/14 10:05 PM, Kasper Daniel Hansen wrote:
You're getting this message because you are using an undefined aspect of ++. Depending on compiler convention re. the interpretation of ++, your code may be interpreted differently; ie. different compilers will interpret the code differently. This is a bad thing. You're presumably getting the warning now, because the compiler flag has been added on the Bioc build servers. There was a recent thread on this specific aspect of ++ recently, but I forgot which email list. Kasper On Mon, Jun 23, 2014 at 2:54 PM, cstrato <cstr...@aon.at <mailto:cstr...@aon.at>> wrote: 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 <mailto: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 <mailto: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/2.14/bioc-LATEST/zin2-NodeInfo.html> http://bioconductor.org/__checkResults/devel/bioc-__LATEST/zin1-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://c-faq.com/expr/seqpoints.html> http://stackoverflow.com/__questions/16838884/why-i-got-__operation-may-be-undefined-in-__statement-expression-in-c <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 <http://aon.at> _._._._._._._._._._._._._._._.___._._ ________________________________________________ R-devel@r-project.org <mailto:R-devel@r-project.org> mailing list https://stat.ethz.ch/mailman/__listinfo/r-devel <https://stat.ethz.ch/mailman/listinfo/r-devel> ________________________________________________ R-devel@r-project.org <mailto:R-devel@r-project.org> mailing list https://stat.ethz.ch/mailman/__listinfo/r-devel <https://stat.ethz.ch/mailman/listinfo/r-devel>
______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel