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. General Programming
  3. C / C++ / MFC
  4. C function call question.

C function call question.

Scheduled Pinned Locked Moved C / C++ / MFC
question
14 Posts 7 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.
  • S samzcs

    But in the program, our system. It works. I tested it. just the caller.h: extern void A(void); I debugged the code, it stepped into the A(i); in fact, only one A() function in the program.

    C Offline
    C Offline
    Chris Losinger
    wrote on last edited by
    #4

    what compiler are you using? at best, i would think the behavior is undefined. the function is going to try to find a parameter, somewhere. maybe it pulls some random garbage off the stack where it expects a parameter to be, or maybe your compiler puts variables into certain registers (and so the function will just grab random garbage out of a register).

    image processing toolkits | batch image processing

    S 1 Reply Last reply
    0
    • S samzcs

      But in the program, our system. It works. I tested it. just the caller.h: extern void A(void); I debugged the code, it stepped into the A(i); in fact, only one A() function in the program.

      L Offline
      L Offline
      Lost User
      wrote on last edited by
      #5

      It looks like you have two different versions of A. But then you are not showing us the complete code.

      1 Reply Last reply
      0
      • C Chris Losinger

        what compiler are you using? at best, i would think the behavior is undefined. the function is going to try to find a parameter, somewhere. maybe it pulls some random garbage off the stack where it expects a parameter to be, or maybe your compiler puts variables into certain registers (and so the function will just grab random garbage out of a register).

        image processing toolkits | batch image processing

        S Offline
        S Offline
        samzcs
        wrote on last edited by
        #6

        It's a GHS compiler. An embedded project.

        _ 1 Reply Last reply
        0
        • S samzcs

          But in the program, our system. It works. I tested it. just the caller.h: extern void A(void); I debugged the code, it stepped into the A(i); in fact, only one A() function in the program.

          K Offline
          K Offline
          k5054
          wrote on last edited by
          #7

          You shoud correct your caller.h to have the correct prototype for A(). Then #include caller.h in both where you define A() and where you invoke it. This "works", due to C calling conventions, where the caller is responsible for pushing and popping arguments off the stack. In your case the caller doesn't push anything on the stack. When A() executes it will use whatever values are on the stack as its parameters, which in this case could be any value at all.

          K 1 Reply Last reply
          0
          • K k5054

            You shoud correct your caller.h to have the correct prototype for A(). Then #include caller.h in both where you define A() and where you invoke it. This "works", due to C calling conventions, where the caller is responsible for pushing and popping arguments off the stack. In your case the caller doesn't push anything on the stack. When A() executes it will use whatever values are on the stack as its parameters, which in this case could be any value at all.

            K Offline
            K Offline
            k5054
            wrote on last edited by
            #8

            Further to this, in C the declaration void f(); does not declare a function with no parameters, but declares a function with an unknown number of parameters. If you know that a function takes no arguments, you should prototype it as void f(void);. Otherwise, the compiler will happily let you do the following:

            void f();
            int main(void)
            {
            f();
            f(15);
            f("Hello", "World");
            }

            Using gcc I can compile the above with -Wall -Wextra, and get no warnings. If I add -Wstrict-prototypes, I do get the warning "function declaration isn’t a prototype [-Wstrict-prototypes]. If you're using MS-VSC, there's probably a similar warning flag that you can use.

            1 Reply Last reply
            0
            • S samzcs

              I read a program, a function definition like:

              void A( int channel)
              {
              }

              While the caller like:

              A(); //no parameter here.

              I know it's OK. can't find a explanation.

              Kornfeld Eliyahu PeterK Offline
              Kornfeld Eliyahu PeterK Offline
              Kornfeld Eliyahu Peter
              wrote on last edited by
              #9

              There are only two options... 1. There is a function declarations in an other (probably h) file with a default value

              // this is in an external h
              void A(int c = 0);

              // this is the main cpp
              int main()
              {
              A(1);
              }

              // this is in an external cpp
              void A(int c)
              {
              // empty
              }

              2. There is an overloaded version of A somewhere else

              Skipper: We'll fix it. Alex: Fix it? How you gonna fix this? Skipper: Grit, spit and a whole lotta duct tape.

              "It never ceases to amaze me that a spacecraft launched in 1977 can be fixed remotely from Earth." ― Brian Cox

              D 1 Reply Last reply
              0
              • Kornfeld Eliyahu PeterK Kornfeld Eliyahu Peter

                There are only two options... 1. There is a function declarations in an other (probably h) file with a default value

                // this is in an external h
                void A(int c = 0);

                // this is the main cpp
                int main()
                {
                A(1);
                }

                // this is in an external cpp
                void A(int c)
                {
                // empty
                }

                2. There is an overloaded version of A somewhere else

                Skipper: We'll fix it. Alex: Fix it? How you gonna fix this? Skipper: Grit, spit and a whole lotta duct tape.

                D Offline
                D Offline
                David Crow
                wrote on last edited by
                #10

                Kornfeld Eliyahu Peter wrote:

                void A(int c = 0);

                Do C functions allow this?

                "One man's wage rise is another man's price increase." - Harold Wilson

                "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                Kornfeld Eliyahu PeterK 1 Reply Last reply
                0
                • D David Crow

                  Kornfeld Eliyahu Peter wrote:

                  void A(int c = 0);

                  Do C functions allow this?

                  "One man's wage rise is another man's price increase." - Harold Wilson

                  "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                  "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                  Kornfeld Eliyahu PeterK Offline
                  Kornfeld Eliyahu PeterK Offline
                  Kornfeld Eliyahu Peter
                  wrote on last edited by
                  #11

                  Of course not - but that only means that OP does not know the difference between C and C++

                  Skipper: We'll fix it. Alex: Fix it? How you gonna fix this? Skipper: Grit, spit and a whole lotta duct tape.

                  "It never ceases to amaze me that a spacecraft launched in 1977 can be fixed remotely from Earth." ― Brian Cox

                  D 1 Reply Last reply
                  0
                  • Kornfeld Eliyahu PeterK Kornfeld Eliyahu Peter

                    Of course not - but that only means that OP does not know the difference between C and C++

                    Skipper: We'll fix it. Alex: Fix it? How you gonna fix this? Skipper: Grit, spit and a whole lotta duct tape.

                    D Offline
                    D Offline
                    David Crow
                    wrote on last edited by
                    #12

                    Kornfeld Eliyahu Peter wrote:

                    Of course not

                    Right. So then why would you suggest to him that such a function was a possible explanation for his question?

                    "One man's wage rise is another man's price increase." - Harold Wilson

                    "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                    "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                    Kornfeld Eliyahu PeterK 1 Reply Last reply
                    0
                    • D David Crow

                      Kornfeld Eliyahu Peter wrote:

                      Of course not

                      Right. So then why would you suggest to him that such a function was a possible explanation for his question?

                      "One man's wage rise is another man's price increase." - Harold Wilson

                      "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

                      "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

                      Kornfeld Eliyahu PeterK Offline
                      Kornfeld Eliyahu PeterK Offline
                      Kornfeld Eliyahu Peter
                      wrote on last edited by
                      #13

                      As I told - I'm not sure OP knows the difference between C and C++ and what language is the project in (a leftover from someone else probably)... Taking in count, that it is part of code from a working system, and that the mentioned compiler can compile both C and C++, and the abilities of C and C++ I put my bet on OP's mistake... In fact if we stick to the C version, it can not work at all (C has only the varargs option, but that forces at least one named parameter, which we have not)...

                      Skipper: We'll fix it. Alex: Fix it? How you gonna fix this? Skipper: Grit, spit and a whole lotta duct tape.

                      "It never ceases to amaze me that a spacecraft launched in 1977 can be fixed remotely from Earth." ― Brian Cox

                      1 Reply Last reply
                      0
                      • S samzcs

                        It's a GHS compiler. An embedded project.

                        _ Offline
                        _ Offline
                        _Superman_
                        wrote on last edited by
                        #14

                        It's possible that the compiler patches the call with a default argument. What is the value in channel? I'm guessing it is 0. Anyway this is not valid in standard C and will surely not compile in GCC or Microsoft C compilers.

                        «_Superman_»  _I love work. It gives me something to do between weekends.

                        _Microsoft MVP (Visual C++) (October 2009 - September 2013)

                        Polymorphism in C

                        1 Reply 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