• Create Account

Your one stop shop for the cause of all coding horrors

38 replies to this topic

#21tanzanite7  Members

1410
Like
0Likes
Like

Posted 02 March 2014 - 04:53 AM

Gamedev forum software crapped its pants again, so can not use any formatting. Did my best to make it readable.

------------------------

frob: "4201 is valid unless you told the compiler to use c++11."

VC++ does not have such a specific switch - all that it is capable of supporting is enabled by default. And i use a lot of c++11 features. One might say that vc++ is not really c11 - but that is not an useful distinction as it tries to be everywhere else.

frob: "The invalid automatic functions are correct, these are not things the compiler can automatically generate."

_Nor does it need to_. The warning is a very low priority bug in the compiler: http://connect.microsoft.com/VisualStudio/feedback/details/488660/improper-issuance-of-c4610

Even so, it is still an useless warning as the language does not allow improper use anyway (ie. more than it normally does) - there is nothing worth warning about.

And yes, one should generally avoid such structures. Exceptions excepted (funny: commented out the warning to see where i use them => apparently i do not use them at all anymore [except a few of the assignment ones - adding "=delete" assignments]).

frob: "4100 is a fun one that requires an understanding of the language history."

Interesting. I did not know that backstory. Thanks.

frob: "The 4310 case is VERY valid in this case. int16(0x8000) is an overflow"

Exactly. Which is why it is tagged "UNHELPFUL" instead of "BOGUS" or "USELESS". Unhelpful is a fairly subjective tag (*).

I use, in every language, hex-notation to signify bit-patterns. Ie. "int16(0x8000)" should be interpreted as bit-pattern 0x8000 in int16 storage (_ie. platform dependently interpreted as some 16 bit integer_). Obviously, C does not interpret it that way and never will - not a problem here.

The warning is very rare.

I have only a few of them from various macro-driven tests. Platform specific integer conversion ... the only place where anyone would write stuff like "int16(0x8000)". Hm, i should move the pragma there and undo it after the test section - much more sane. Thanks.

(*) I copy pasted thous few example lines out - leaving out some less likely useful ones (and commented out unused ones) and a few comments. One of them probably bited here. Pragma reminder-comment in split with "//": left of it is about the warning - to the right is for use-case reminders of how one might get the warning etc. So, BOGUS for "int16(0x8000)" does not mean the warning is bogus! - it signifies that it is UNHELPFUL as it is BOGUS for the use-case (the bit pattern fits nicely).

Perhaps i should have left out all the UNHELPFUL tagged ones here due of their high subjectivity.

#22swiftcoder  Senior Moderators

17815
Like
1Likes
Like

Posted 02 March 2014 - 12:07 PM

Maybe, but as the article says, it like saying "if blue is the sky" or "if tall is the man", it's just harder to read this way imo. Forgetting a '=' is not an excuse for writing harder to read code imo, since that doesn't happen very often.

It happens an awful lot more than you might expect. Defensive coding is important, and it often comes at a perceived cost to readability.

I'd honestly be rather alarmed to meet a senior engineer who didn't write their conditions that way, when coding in C++.

Tristam MacDonald - Software Engineer @ Amazon - [swiftcoding] [GitHub]

#23Dragonsoulj  Members

3177
Like
0Likes
Like

Posted 02 March 2014 - 12:36 PM

#pragma warning(disable : 4127) // (UNHELPFUL) conditional expression is constant // this is actually almost always desired

It is? Isn't the conditional expression rather pointless if it is constant or am I missing something?

while(RUNNING == gameState)
{
// Run Game Code
}

#24tanzanite7  Members

1410
Like
0Likes
Like

Posted 02 March 2014 - 03:05 PM

Oh, missed a post.

#pragma warning(disable : 4127) // (UNHELPFUL) conditional expression is constant // this is actually almost always desired

It is? Isn't the conditional expression rather pointless if it is constant or am I missing something?

Typical direct example: "while(true) { ... }". But it usually comes indirectly from macros and templates (ie. stuff that is not, in its final, form written by the programmer).

Ie. the warning is valid, but unfortunately tends to flag code that is perfectly fine - which is just too annoying of a problem when one treats warnings as errors that could be temporarily ignored. Hence: UNHELPFUL.

#25Olof Hedman  Members

5700
Like
0Likes
Like

Posted 03 March 2014 - 02:50 AM

while(RUNNING == gameState)
{
// Run Game Code
}

That's not a constant conditional expression, unless gameState is const, which I assume it is not...

But it usually comes indirectly from macros and templates (ie. stuff that is not, in its final, form written by the programmer).
Ie. the warning is valid, but unfortunately tends to flag code that is perfectly fine - which is just too annoying of a problem when one treats warnings as errors that could be temporarily ignored. Hence: UNHELPFUL.

Ah of course, got it.

#26Tutorial Doctor  Members

2564
Like
0Likes
Like

Posted 03 March 2014 - 01:25 PM

gameState could be a constant though (just not all caps). This one guy I know uses constants to do boolean operations rather than using true or false. If the state of the game never changes then sure....

RUNNING = 0
gameState= 0

while (RUNNING == gameState)
{//Run Game Code}


Edited by Tutorial Doctor, 03 March 2014 - 01:27 PM.

They call me the Tutorial Doctor.

#27Aardvajk  Members

12267
Like
3Likes
Like

Posted 05 March 2014 - 08:35 AM

I've personally never understood Yoda-expressions or whatever they are called, because of the inconsistency - you can't do this if you are comparing two things that are both non-constant, so you've got this bizarre programming "trick" that only works on a subset of your expressions. I feel relying on things like this just make it more likely I'll get into a bad habit and screw up when I'm meaning to compare two non-constants.

I personally prefer to just pay attention to the compiler warning me about a possible wrong assignment in a conditional. I do still occasionally make this typo but the compiler has been warning be about it for at least the last ten years.

#28Tutorial Doctor  Members

2564
Like
0Likes
Like

Posted 05 March 2014 - 09:56 AM

Good word Aardvajk. It's more so about habits, and it seems good ones should be developed early on. I think it has something to do with how the person was taught to program. There are generalized standards, but no book of standards. I do doubt people would follow that book of standards anyway, but there are perhaps some standards everyone can agree on?

They call me the Tutorial Doctor.

#29Bacterius  Members

13100
Like
3Likes
Like

Posted 05 March 2014 - 09:19 PM

I've personally never understood Yoda-expressions or whatever they are called, because of the inconsistency - you can't do this if you are comparing two things that are both non-constant, so you've got this bizarre programming "trick" that only works on a subset of your expressions. I feel relying on things like this just make it more likely I'll get into a bad habit and screw up when I'm meaning to compare two non-constants.

I personally prefer to just pay attention to the compiler warning me about a possible wrong assignment in a conditional. I do still occasionally make this typo but the compiler has been warning be about it for at least the last ten years.

Same here. I can see why people would like this trick if they get into the habit, but I started with traditional "if variable == constant/variable" as well and frankly I never found it difficult to not mess up. Unless you have a really poor monospace font, = and == look nothing alike, and if you do screw up the compiler does point it out (I mean, guys, seriously, crank up those warning settings, and actually fix them when they appear, otherwise you really have no leg to stand on about the compiler being unhelpful).

It definitely has to do with how you were taught. Old habits die hard, and bad habits tend to take even more time to go away (because bad habits have a tendency of working great at first, before suddenly coming crashing down all around you and requiring a complete redesign). It is in my opinion healthy to always question your own code style to some extent from time to time, I definitely know mine has changed wildly over the years when I found some stuff didn't work well or wasn't consistent enough, etc..

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”

#30Olof Hedman  Members

5700
Like
0Likes
Like

Posted 06 March 2014 - 02:48 AM

I personally prefer to just pay attention to the compiler warning me about a possible wrong assignment in a conditional. I do still occasionally make this typo but the compiler has been warning be about it for at least the last ten years.

Me too.

I'm sure this habit was invented before compilers were as good as they are today with warnings and such.

#31TheComet  Members

2673
Like
0Likes
Like

Posted 06 March 2014 - 11:54 AM

I have tricremented your reputation, thanks for sharing. This has caused me to do some ninjawork.

"I would try to find halo source code by bungie best fps engine ever created, u see why call of duty loses speed due to its detail." -- GettingNifty

#32Kryzon  Prime Members

4433
Like
1Likes
Like

Posted 09 March 2014 - 05:32 PM

This is somewhat related. A collection of humorous comments.

http://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered

#33tanzanite7  Members

1410
Like
4Likes
Like

Posted 11 March 2014 - 09:22 AM

I enjoyed this - thanks for sharing.

Also:
// somedev1 -  6/7/02 Adding temporary tracking of Login screen
// somedev2 -  5/22/07 Temporary my ass
The history of software development in a nutshell.

#34Waaayoff  Members

951
Like
1Likes
Like

Posted 19 March 2014 - 10:16 AM

I enjoyed this - thanks for sharing.

Also:

// somedev1 -  6/7/02 Adding temporary tracking of Login screen
// somedev2 -  5/22/07 Temporary my ass
The history of software development in a nutshell.

When I was just programming for fun, i saw that thread and laughed. Oh how i laughed. Now that i'm getting paid to maintain someone else's code...

"Spending your life waiting for the messiah to come save the world is like waiting around for the straight piece to come in Tetris...even if it comes, by that time you've accumulated a mountain of shit so high that you're fucked no matter what you do. "

#35samoth  Members

8935
Like
0Likes
Like

Posted 19 March 2014 - 11:16 AM

Yoda

Not forget you must, that in different form, use this construct you do. Yes, yes.

This not like you do:

if(5 == function())
//if five it is, this function

but this accept you do:

if(!function())

// if not true it is, this function

(Though I can't help myself stopping completely puzzled for an instant every time I see Yoda code, too)

Then again...

if(!(5== func()) && !other_func())

// If not five is func, and only execute not other func

Edited by samoth, 19 March 2014 - 11:34 AM.

#36jjd  Members

2140
Like
0Likes
Like

Posted 19 March 2014 - 12:19 PM

Maybe, but as the article says, it like saying "if blue is the sky" or "if tall is the man", it's just harder to read this way imo. Forgetting a '=' is not an excuse for writing harder to read code imo, since that doesn't happen very often.

It happens an awful lot more than you might expect. Defensive coding is important, and it often comes at a perceived cost to readability.

I'd honestly be rather alarmed to meet a senior engineer who didn't write their conditions that way, when coding in C++.

And, as with a lot of coding practices, it probably varies depending on the kind of company you keep. I predominantly come across this particular convention from engineers who like to follow simple rules but cannot think about the implications of their design decisions or create a decent interface to save their lives. Do I think this is true of all engineers who follow this rule, no. But I do find it hard to shake the weight of evidence I have come across

-Josh

--www.physicaluncertainty.com
--irc.freenode.net#gdnet

#37ferrous  Members

5755
Like
0Likes
Like

Posted 24 March 2014 - 03:31 PM

Nice article, i personally hate with passion the "Yoda Conditions".

ex: if(5 == count)

I understand why they are done though.  If someone mistypes or is just used to a language with only a single '=',  and does

if(count = 5)

They will only get a warning (and they didn't always get a warning back in the olden days).  While

if(5 = count)

Will error.

And honestly, there should never be a plain number in an if statement anyway, it should be a constant or #define somewhere, like so:

if(kMaxSize == count)

which tends to make it look less nonsensical and yoda like.

#38slicer4ever  GDNet+

6355
Like
3Likes
Like

Posted 24 March 2014 - 04:56 PM

Nice article, i personally hate with passion the "Yoda Conditions".

ex: if(5 == count)

I understand why they are done though.  If someone mistypes or is just used to a language with only a single '=',  and does

if(count = 5)

They will only get a warning (and they didn't always get a warning back in the olden days).  While

if(5 = count)

Will error.

And honestly, there should never be a plain number in an if statement anyway, it should be a constant or #define somewhere, like so:

if(kMaxSize == count)

which tends to make it look less nonsensical and yoda like.

Honestly, after so long this stops being a problem, maybe the occasional mistype occurs, but really this is something that's only prevalent in new/inexperienced programmers.

Check out https://www.facebook.com/LiquidGames for some great games made by me on the Playstation Mobile market.

#39Juliean  GDNet+

6201
Like
0Likes
Like

Posted 24 March 2014 - 05:36 PM

I understand why they are done though. If someone mistypes or is just used to a language with only a single '=', and does

if(count = 5)

They will only get a warning (and they didn't always get a warning back in the olden days). While

if(5 = count)

Will error.

I agree with slicer4ever, thats kind of like saying one should always return a pointer instead of a reference because someone might forget to type the "&" at the receiving variable declaration and create an accidential copy. To sparse of an event to adjust your coding routine to that kind of stuff.

Edited by Juliean, 24 March 2014 - 05:37 PM.