Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. Other Discussions
  3. The Weird and The Wonderful
  4. Fun with pointers in C++

Fun with pointers in C++

Scheduled Pinned Locked Moved The Weird and The Wonderful
c++question
33 Posts 16 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Daniel Pfeffer

    X| A possibly better (and much clearer) implementation would be to have GetA() and GetB() return references. You could then write the code without the idirection.

    If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill

    C Offline
    C Offline
    C3D1
    wrote on last edited by
    #5

    Sorry, that's not my code, an i cant change it. I just saw it in some code and where surprised what's that :D Returning references would make it much harder to read:

    GetA() = GetB()

    looks like What the hell? Assignment to a Function? :omg: :wtf:

    D T L 3 Replies Last reply
    0
    • C C3D1

      Today i come across this two lines of code (i changed the naming of the functions):

      // ...
      if(GetA() && GetB())
      *GetA() = *GetB();
      // ...

      took me nearly two hours of figuring out WHY DOES THIS CODE WORK, since i realised thatGetA() returns a Pointer and Pointers are IValue... Looked deeper inside the code, i found a SetA(int)-Method... Why to use something like

      *GetA() = *GetB()

      if you could use

      SetA(*GetB())

      D Offline
      D Offline
      DEmberton
      wrote on last edited by
      #6

      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

      C 1 Reply Last reply
      0
      • D DEmberton

        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

        C Offline
        C Offline
        C3D1
        wrote on last edited by
        #7

        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. ;P :-\

        1 Reply Last reply
        0
        • C C3D1

          Today i come across this two lines of code (i changed the naming of the functions):

          // ...
          if(GetA() && GetB())
          *GetA() = *GetB();
          // ...

          took me nearly two hours of figuring out WHY DOES THIS CODE WORK, since i realised thatGetA() returns a Pointer and Pointers are IValue... Looked deeper inside the code, i found a SetA(int)-Method... Why to use something like

          *GetA() = *GetB()

          if you could use

          SetA(*GetB())

          J Offline
          J Offline
          James Curran
          wrote on last edited by
          #8

          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

          M T 2 Replies Last reply
          0
          • J James Curran

            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

            M Offline
            M Offline
            MarkTJohnson
            wrote on last edited by
            #9

            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.

            F B 2 Replies Last reply
            0
            • C C3D1

              Sorry, that's not my code, an i cant change it. I just saw it in some code and where surprised what's that :D Returning references would make it much harder to read:

              GetA() = GetB()

              looks like What the hell? Assignment to a Function? :omg: :wtf:

              D Offline
              D Offline
              Daniel Pfeffer
              wrote on last edited by
              #10

              C3D1 wrote:

              Returning references would make it much harder to read

              We'll just have to agree to disagree on that. IMO, this is a quite useful C++ paradigm.

              If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill

              K R 2 Replies Last reply
              0
              • M Mladen Jankovic

                That's even worse:

                GetA() = GetB();

                And due to if statement we must assume that A and B can be nulls. GetA and GetB should return const pointers.

                GeoGame for Windows Phone

                D Offline
                D Offline
                Daniel Pfeffer
                wrote on last edited by
                #11

                My bad; I missed the if statement. IMO, if code needs such a test, it probably has a poor architecture to begin with. It is much better to have a special dummy instance of a type to represent 'not present', and reserve the null pointer for truly bad situations that crash the program. Reasonable people may differ on this. :)

                If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill

                1 Reply Last reply
                0
                • M Mario Vernari

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

                  F Offline
                  F Offline
                  firegryphon
                  wrote on last edited by
                  #12

                  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.

                  1 Reply Last reply
                  0
                  • M MarkTJohnson

                    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.

                    F Offline
                    F Offline
                    firegryphon
                    wrote on last edited by
                    #13

                    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.

                    1 Reply Last reply
                    0
                    • M MarkTJohnson

                      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.

                      B Offline
                      B Offline
                      BotReject
                      wrote on last edited by
                      #14

                      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.

                      1 Reply Last reply
                      0
                      • C C3D1

                        Today i come across this two lines of code (i changed the naming of the functions):

                        // ...
                        if(GetA() && GetB())
                        *GetA() = *GetB();
                        // ...

                        took me nearly two hours of figuring out WHY DOES THIS CODE WORK, since i realised thatGetA() returns a Pointer and Pointers are IValue... Looked deeper inside the code, i found a SetA(int)-Method... Why to use something like

                        *GetA() = *GetB()

                        if you could use

                        SetA(*GetB())

                        A Offline
                        A Offline
                        Al Chak
                        wrote on last edited by
                        #15

                        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 :cool:

                        T 1 Reply Last reply
                        0
                        • C C3D1

                          Sorry, that's not my code, an i cant change it. I just saw it in some code and where surprised what's that :D Returning references would make it much harder to read:

                          GetA() = GetB()

                          looks like What the hell? Assignment to a Function? :omg: :wtf:

                          T Offline
                          T Offline
                          TheGreatAndPowerfulOz
                          wrote on last edited by
                          #16

                          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

                          1 Reply Last reply
                          0
                          • A Al Chak

                            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 :cool:

                            T Offline
                            T Offline
                            TheGreatAndPowerfulOz
                            wrote on last edited by
                            #17

                            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

                            1 Reply Last reply
                            0
                            • J James Curran

                              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

                              T Offline
                              T Offline
                              TheGreatAndPowerfulOz
                              wrote on last edited by
                              #18

                              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

                              J 1 Reply Last reply
                              0
                              • T TheGreatAndPowerfulOz

                                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

                                J Offline
                                J Offline
                                James Curran
                                wrote on last edited by
                                #19

                                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

                                T 1 Reply Last reply
                                0
                                • J James Curran

                                  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

                                  T Offline
                                  T Offline
                                  TheGreatAndPowerfulOz
                                  wrote on last edited by
                                  #20

                                  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

                                  J 1 Reply Last reply
                                  0
                                  • T TheGreatAndPowerfulOz

                                    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

                                    J Offline
                                    J Offline
                                    James Curran
                                    wrote on last edited by
                                    #21

                                    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

                                    T 1 Reply Last reply
                                    0
                                    • J James Curran

                                      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

                                      T Offline
                                      T Offline
                                      TheGreatAndPowerfulOz
                                      wrote on last edited by
                                      #22

                                      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

                                      1 Reply Last reply
                                      0
                                      • D Daniel Pfeffer

                                        C3D1 wrote:

                                        Returning references would make it much harder to read

                                        We'll just have to agree to disagree on that. IMO, this is a quite useful C++ paradigm.

                                        If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill

                                        K Offline
                                        K Offline
                                        KP Lee
                                        wrote on last edited by
                                        #23

                                        Daniel Pfeffer wrote:

                                        IMO, this is a quite useful C++ paradigm.

                                        ...and that makes me even happier to barely being able to read C++ :laugh:

                                        D 1 Reply Last reply
                                        0
                                        • K KP Lee

                                          Daniel Pfeffer wrote:

                                          IMO, this is a quite useful C++ paradigm.

                                          ...and that makes me even happier to barely being able to read C++ :laugh:

                                          D Offline
                                          D Offline
                                          Daniel Pfeffer
                                          wrote on last edited by
                                          #24

                                          De gustibus non est disputandum :)

                                          If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack. --Winston Churchill

                                          K B 2 Replies Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups