|
Beautifully expressed and I agree totally.
"Rock journalism is people who can't write interviewing people who can't talk for people who can't read." Frank Zappa 1980
|
|
|
|
|
Daniel Pfeffer wrote: Amazingly, the amount of sniping and backbiting is kept to a minimum! Hear Hear (Or is that Here Here? ) Sometimes I find myself biting my tongue, but not on this thread. (Yet, and this thread is starting to grow a beard)
|
|
|
|
|
Daniel Pfeffer wrote: De gustibus non est disputandum I.e. C++ is the Durian (stinkfruit) in Software Development.
|
|
|
|
|
I agree, but I definitely would not name such a function "GetA".
"If you don't fail at least 90 percent of the time, you're not aiming high enough."
Alan Kay.
|
|
|
|
|
Learn to read code.
Assignment to a function would be
GetA = GetB() which would mean GetB() returns a function pointer rather than an int* and GetA is function pointer rather than a function.
Learn to read code.
#SupportHeForShe If your actions inspire others to dream more, learn more, do more and become more, you are a leader.-John Q. Adams
You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun
Only 2 things are infinite, the universe and human stupidity, and I'm not sure about the former.-Albert Einstein
|
|
|
|
|
You can't read C++ code without knowing the types. Who knows if equals was overridden, everything could happen.
Even then you should read, GetA() return something, then operator = is called on this something.
|
|
|
|
|
In two hours you can have a great lunch, jogging, some fun with your partner, some nice song listening/playing and also a shower.
All that cannot be done because the language is cryptic: that's why I hate C/C++!
Good post, though...
|
|
|
|
|
That's my issue with the language too. I once spent a day trying to understand a piece of code from a heavily modified Diku-based MUD when I was in college after a friend begged for help to fix some issues on his MUD.
|
|
|
|
|
Mario Vernari wrote: that's why I hate C/C++! Yea, I kind of agree with that sentiment, however, I have yet to run across the language that will supply me with a great lunch, but I do admit to sometimes having fun with it. (Does that mean I'm cheating on my partner?)
|
|
|
|
|
Mario Vernari wrote: that's why I hate C/C++! Yea, I kind of agree with that sentiment, however, I have yet to run across the language that will supply me with a great lunch, but I do admit to sometimes having fun with it. (Not C++ and does that mean I'm cheating on my partner?)
|
|
|
|
|
A good example of why you should use const:
const int* GetA() const { return &m_a; }
*GetA() = *GetB(); // compile error - use the Set function you numpty
|
|
|
|
|
totally agree with you.
But always use const can cause some other problems.
I personally try to avoid "pointer-getter-functions" but when i have to use, i do something like this:
class Foo
{
private:
int m_nA;
public:
int* GetAPtr() { return &m_nA; }
const int& GetA() const { return m_nA; }
void SetA(int nA) { ASSERT(IsValid(nA)); m_nA = nA; }
};
And if i have to use the pointer-getter i have to write Ptr explicit. So i see extremly fast that
*GetAPtr() = *GetBPtr();
is nonesense, and if you try to do
GetA() = GetB();
you get a compiler-error
Maybe my way overshot the mark a litte bit. 
|
|
|
|
|
My only problem with that is that GetA and GetB are being called twice each. There is, of course, no guarantee that the second call to either will return the same value as the first. Further, there is not guarantee that either isn't an expensive operation.
I would probably go for the much clearer:
A* pa = GetA();
B* pb = GetB();
if (pa != NULL && pb!= NULL)
*pa = *pb;
Unfortunately, this method would always call GetB once, while the original would never call GetB if the first call to GetA returned NULL, so determining which is more efficient depends of how expensive the call to GetB is, and the likelihood than GetA returns null.
Which would give us this:
A* pa = GetA();
if (pa != NULL)
{
B* pb = GetB();
if (pb != NULL)
*pa = *pb;
}
Which, despite being the most keystrokes, would be the best method in terms of speed efficiency, memory efficiency (fewest assembly instructions), and code clarity.
In other words, just freakin' learn to type.
Truth,
James
modified 26-Jun-15 11:48am.
|
|
|
|
|
Amen Brother!
Was saying something similar this morning. Our Java guys have all these layers Spock, Groovy, Gradle, etc on top of the Java code to make life "simpler" and "easier". They spent the same, if not more, amount of time learning about those things as they would have just doing whatever it was by hand.
But code in Delphi mainly so what do I know?
Back when I was coding in C I was smart, now it doesn't feel like it so much because the languages take care of too much stuff for you and you don't have to think about it.
|
|
|
|
|
Ah Delphi, the evolution of my first true love. Where nothing is left to chance for knowing the types and how things are evaluated... I miss Delphi. I loath Fortran even F2003. Such is the life of maintaining aerospace code.
|
|
|
|
|
That's why I prefer to code in Java rather than C++. Though I have written small apps in C++, I prefer to focus on the logic of data flow instead of the detailed memory structure of the RAM. Indeed, this is why I prefer Java to C#, though again I have used the latter quite a lot. This might be because I write a lot of mathematical apps where the logic of data flow is hard enough without extra overheads. Java just seems relatively effortless for coding such applications. That said, I do occasionally code in C++, and even assembly language, simply because I like to be reminded how computers work for my own academic satisfaction. However, I do miss the days of C64 POKE and PEEK - one really felt as if one was in control of the computer in those days.
|
|
|
|
|
what about:
int* a;
int* b;
if ((a = GetA()) && (b = GetB()))
{
*a = *b;
}
#SupportHeForShe If your actions inspire others to dream more, learn more, do more and become more, you are a leader.-John Q. Adams
You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun
Only 2 things are infinite, the universe and human stupidity, and I'm not sure about the former.-Albert Einstein
|
|
|
|
|
That does work, but
if (a = GetA()) ... is too easy to mistake for
if (a == GetA()) ...
Which is why I never leave the comparison implied, so we get:
if ((a = GetA()) != NULL && (b = GetB()) != NULL)
which is rather unwieldy. And for what purpose? The longer version I posted will produce the exact same object code.
Truth,
James
|
|
|
|
|
James Curran wrote: The longer version I posted will produce the exact same object code. Will it? The version you and I just discussed has the advantage of short-circuiting, where the first version you posted does not. Which is a "limitation" you pointed-out.
#SupportHeForShe If your actions inspire others to dream more, learn more, do more and become more, you are a leader.-John Q. Adams
You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun
Only 2 things are infinite, the universe and human stupidity, and I'm not sure about the former.-Albert Einstein
|
|
|
|
|
I was referring to the second version I posted (i.e., "the longer version", the one with nested if()s).
And that does produce identical object code. From VisualStudio 2013, Release build:
Mine:
; 21 : void Method2()
; 22 : {
; 23 : A* pa = GetA();
00023 e8 00 00 00 00 call ?GetA@@YAPAHXZ ; GetA
00028 8b f0 mov esi, eax
; 24 : if (pa != NULL)
0002a 85 f6 test esi, esi
0002c 74 0d je SHORT $LN6@wmain
; 25 : {
; 26 : B* pb = GetB();
0002e e8 00 00 00 00 call ?GetB@@YAPAHXZ ; GetB
; 27 : if (pb != NULL)
00033 85 c0 test eax, eax
00035 74 04 je SHORT $LN6@wmain
; 28 : *pa = *pb;
00037 8b 08 mov ecx, DWORD PTR [eax]
00039 89 0e mov DWORD PTR [esi], ecx
$LN6@wmain:
; 29 : }
; 30 : }
and yours:
; 32 : void Method3()
; 33 : {
; 34 : A* a;
; 35 : B* b;
; 36 : if ((a = GetA()) && (b = GetB()))
0003b e8 00 00 00 00 call ?GetA@@YAPAHXZ ; GetA
00040 8b f0 mov esi, eax
00042 85 f6 test esi, esi
00044 74 0d je SHORT $LN13@wmain
00046 e8 00 00 00 00 call ?GetB@@YAPAHXZ ; GetB
0004b 85 c0 test eax, eax
0004d 74 04 je SHORT $LN13@wmain
; 37 : {
; 38 : *a = *b;
0004f 8b 08 mov ecx, DWORD PTR [eax]
00051 89 0e mov DWORD PTR [esi], ecx
$LN13@wmain:
That's with all standard "Release mode" optimizations on, except "Whole Program Optimization" (to prevent it from inlining GetA & GetB)
Truth,
James
|
|
|
|
|
Interesting. Thanks.
#SupportHeForShe If your actions inspire others to dream more, learn more, do more and become more, you are a leader.-John Q. Adams
You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun
Only 2 things are infinite, the universe and human stupidity, and I'm not sure about the former.-Albert Einstein
|
|
|
|
|
Your code will be correct if both GetA and GetB return pointer on GLOBAL or STATIC variable same type ofcorse.
It is possible to code on C++ without C-knowledge, but not to programm 
|
|
|
|
|
It would also be correct within the context of the code for a class where the functions are returning pointers to data members.
#SupportHeForShe If your actions inspire others to dream more, learn more, do more and become more, you are a leader.-John Q. Adams
You must accept 1 of 2 basic premises: Either we are alone in the universe or we are not alone. Either way, the implications are staggering!-Wernher von Braun
Only 2 things are infinite, the universe and human stupidity, and I'm not sure about the former.-Albert Einstein
|
|
|
|
|
Came across this kind of code today...
void EnableFromValue(bool enabled)
{
switch (enabled) {
case true:
FirstControl.Enabled = true;
SecondControl.Enabled = true;
...
break;
case false:
FirstControl.Enabled = false;
SecondControl.Enabled = false;
...
break;
}
}
I'm sure there must be a better way
"If you don't fail at least 90 percent of the time, you're not aiming high enough."
Alan Kay.
|
|
|
|
|
I voted this a 5 because it was funny, but I could see a valid reason for that... if they wanted to encapsulate the logic of which controls were affected into a single resource I could see me doing that. Especially if it's called in more than one area.
Jeremy Falcon
|
|
|
|