Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


Your one stop shop for the cause of all coding horrors

  • You cannot reply to this topic
38 replies to this topic

#21 tanzanite7   Members   -  Reputation: 1378

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.



Sponsor:

#22 swiftcoder   Senior Moderators   -  Reputation: 10396

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]


#23 Dragonsoulj   Crossbones+   -  Reputation: 2128

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
}


#24 tanzanite7   Members   -  Reputation: 1378

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.



#25 Olof Hedman   Crossbones+   -  Reputation: 2953

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.



#26 Tutorial Doctor   Members   -  Reputation: 1692

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.


#27 Aardvajk   Crossbones+   -  Reputation: 6239

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.



#28 Tutorial Doctor   Members   -  Reputation: 1692

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.


#29 Bacterius   Crossbones+   -  Reputation: 9289

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..


The slowsort algorithm is a perfect illustration of the multiply and surrender paradigm, which is perhaps the single most important paradigm in the development of reluctant algorithms. The basic multiply and surrender strategy consists in replacing the problem at hand by two or more subproblems, each slightly simpler than the original, and continue multiplying subproblems and subsubproblems recursively in this fashion as long as possible. At some point the subproblems will all become so simple that their solution can no longer be postponed, and we will have to surrender. Experience shows that, in most cases, by the time this point is reached the total work will be substantially higher than what could have been wasted by a more direct approach.

 

- Pessimal Algorithms and Simplexity Analysis


#30 Olof Hedman   Crossbones+   -  Reputation: 2953

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.



#31 TheComet   Crossbones+   -  Reputation: 1644

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.


YOUR_OPINION >/dev/null

#32 Kryzon   Prime Members   -  Reputation: 3314

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

#33 tanzanite7   Members   -  Reputation: 1378

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.

#34 Waaayoff   Members   -  Reputation: 783

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. "

#35 samoth   Crossbones+   -  Reputation: 5036

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.


#36 jjd   Crossbones+   -  Reputation: 2122

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
--linkedin
--irc.freenode.net#gdnet


#37 ferrous   Members   -  Reputation: 2146

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.



#38 slicer4ever   Crossbones+   -  Reputation: 3986

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.

#39 Juliean   GDNet+   -  Reputation: 2741

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.






PARTNERS