Passing function pointers as arrays of chars

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Olaf Dietrich

    Passing function pointers as arrays of chars

    I may just be temporarily (hopefully ...) stupid, but how can
    I pass a function pointer between functions using an array of
    (signed/unsigned) chars (in a standard-conforming way)?


    E.g.:

    I have a function: int (*func)(double, int).

    Now I'd like to store the "address" of this function
    in an array (of sufficient size) of chars, e.g. in
    char func_addr[100]. (How can I do this?)

    And finally I would like to use this address in another
    function pointer:
    new_func = (int (*)(double, int)) func_addr.

    This doesn't work - gcc complains: "ISO C forbids conversion
    of object pointer to function pointer type".


    Is there a way to store the data that constitutes the function
    pointer in an array of chars (that need not have the size of
    an object pointer)? And then to re-interpret this sequence of
    bytes again as a function pointer?


    Thanks for any suggestions
    Olaf
  • James Kuyper

    #2
    Re: Passing function pointers as arrays of chars

    Olaf Dietrich wrote:
    I may just be temporarily (hopefully ...) stupid, but how can
    I pass a function pointer between functions using an array of
    (signed/unsigned) chars (in a standard-conforming way)?
    >
    >
    E.g.:
    >
    I have a function: int (*func)(double, int).
    >
    Now I'd like to store the "address" of this function
    in an array (of sufficient size) of chars, e.g. in
    char func_addr[100]. (How can I do this?)

    char func_addr[sizeof func];
    memcpy(func_add r, &func, sizeof func);
    And finally I would like to use this address in another
    function pointer:
    new_func = (int (*)(double, int)) func_addr.
    memcpy(&new_fun c, func_addr, sizeof new_func);
    This doesn't work - gcc complains: "ISO C forbids conversion
    of object pointer to function pointer type".
    That's because you're trying to convert func_addr, which in this context
    decays into a pointer to the first char of that array, into a pointer to
    a function. What you want it to do is interpret the contents of that
    array as if it were a pointer to a function. The syntax for such a
    conversion (were it safe) would be:

    new_func = *(int (**)(double, int)) func_addr;

    This converts func_addr from a pointer to an array of char into a
    pointer to a function pointer, then dereferences that pointer, obtaining
    a function pointer. This is not, unfortunately, a safe approach to
    use, because there's no guarantee that func_addr is correctly aligned to
    hold such a pointer. You could guarantee correct alignment if func_addr
    were a pointer to a dynamically allocated array of char, or if func_addr
    were part of a union with a the appropriate function pointer type.

    Comment

    • Olaf Dietrich

      #3
      Re: Passing function pointers as arrays of chars

      James Kuyper <jameskuyper@ve rizon.net>:
      Olaf Dietrich wrote:
      >
      >Now I'd like to store the "address" of this function
      >in an array (of sufficient size) of chars, e.g. in
      >char func_addr[100]. (How can I do this?)
      >
      char func_addr[sizeof func];
      memcpy(func_add r, &func, sizeof func);
      >
      >And finally I would like to use this address in another
      >function pointer:
      >
      memcpy(&new_fun c, func_addr, sizeof new_func);
      How obvious and simple ... (and it even works).

      Thank you very much for your help
      Olaf

      Comment

      • Nick Keighley

        #4
        Re: Passing function pointers as arrays of chars

        On 22 Oct, 13:10, o...@dtrx.de (Olaf Dietrich) wrote:
        I may just be temporarily (hopefully ...) stupid, but how can
        I pass a function pointer between functions using an array of
        (signed/unsigned) chars (in a standard-conforming way)?
        why do you want to do this? Some sort of callback function?
        It's best avoided if you can.

        <snip>

        --
        Nick Keighley


        Comment

        • vippstar@gmail.com

          #5
          Re: Passing function pointers as arrays of chars

          On Oct 22, 3:31 pm, James Kuyper <jameskuy...@ve rizon.netwrote:
          Olaf Dietrich wrote:
          I may just be temporarily (hopefully ...) stupid, but how can
          I pass a function pointer between functions using an array of
          (signed/unsigned) chars (in a standard-conforming way)?
          >
          E.g.:
          >
          I have a function: int (*func)(double, int).
          >
          Now I'd like to store the "address" of this function
          in an array (of sufficient size) of chars, e.g. in
          char func_addr[100]. (How can I do this?)
          >
          char func_addr[sizeof func];
          memcpy(func_add r, &func, sizeof func);
          How will this work since the conversion between void * and a function
          pointer needs not to be meaningful? (6.3.2.3)
          (notice the memcpy call)
          Also, while the first line is possible for function pointers, it's not
          for function designators;
          This is correct:

          void (*fp)(void);
          char foo[sizeof fp];

          This is incorrect:

          char foo[sizeof strcpy];

          Because it violates the constraint in 6.5.3.4

          Comment

          • jameskuyper@verizon.net

            #6
            Re: Passing function pointers as arrays of chars

            vipps...@gmail. com wrote:
            On Oct 22, 3:31 pm, James Kuyper <jameskuy...@ve rizon.netwrote:
            Olaf Dietrich wrote:
            ....
            I have a function: int (*func)(double, int).
            Now I'd like to store the "address" of this function
            in an array (of sufficient size) of chars, e.g. in
            char func_addr[100]. (How can I do this?)
            char func_addr[sizeof func];
            memcpy(func_add r, &func, sizeof func);
            >
            How will this work since the conversion between void * and a function
            pointer needs not to be meaningful? (6.3.2.3)
            (notice the memcpy call)
            No such conversion is performed by this code. The only pointers being
            converted are func_addr and &func, in the memcpy() call that you refer
            to. Both of those are pointers to objects. func_addr is pointer to a
            char object, and &func is a pointer to a function pointer object.
            Neither one is a pointer to a function. func itself is a pointer to a
            function, but func is NOT being converted to void*.
            Also, while the first line is possible for function pointers, it's not
            for function designators;
            The question I answered was specifically about func, which is a
            function pointer object. Function pointer values have to be stored in
            a function pointer object before this approach can be used.

            Comment

            • vippstar@gmail.com

              #7
              Re: Passing function pointers as arrays of chars

              On Oct 22, 8:50 pm, jameskuy...@ver izon.net wrote:
              vipps...@gmail. com wrote:
              On Oct 22, 3:31 pm, James Kuyper <jameskuy...@ve rizon.netwrote:
              Olaf Dietrich wrote:
              ...
              I have a function: int (*func)(double, int).
              >
              Now I'd like to store the "address" of this function
              in an array (of sufficient size) of chars, e.g. in
              char func_addr[100]. (How can I do this?)
              >
              char func_addr[sizeof func];
              memcpy(func_add r, &func, sizeof func);
              >
              How will this work since the conversion between void * and a function
              pointer needs not to be meaningful? (6.3.2.3)
              (notice the memcpy call)
              >
              No such conversion is performed by this code. The only pointers being
              converted are func_addr and &func, in the memcpy() call that you refer
              to. Both of those are pointers to objects. func_addr is pointer to a
              char object, and &func is a pointer to a function pointer object.
              Neither one is a pointer to a function. func itself is a pointer to a
              function, but func is NOT being converted to void*.
              Could you give me the type of func?
              You say it's a pointer to a function pointer.
              Does it mean it's T (**)()?
              If so, then your code works and I apologise, however... (read below)
              Also, while the first line is possible for function pointers, it's not
              for function designators;
              >
              The question I answered was specifically about func, which is a
              function pointer object. Function pointer values have to be stored in
              a function pointer object before this approach can be used.
              Here you say func is a function pointer object, which contradicts what
              you said before.

              After some test, I realize where I was wrong:

              & doesn't have an effect with function designators, however it does
              have for function pointers.
              Therefore, your code is correct and I was wrong. :-)

              Comment

              • jameskuyper@verizon.net

                #8
                Re: Passing function pointers as arrays of chars

                vipps...@gmail. com wrote:
                On Oct 22, 8:50 pm, jameskuy...@ver izon.net wrote:
                vipps...@gmail. com wrote:
                On Oct 22, 3:31 pm, James Kuyper <jameskuy...@ve rizon.netwrote:
                Olaf Dietrich wrote:
                ...
                I have a function: int (*func)(double, int).
                ....
                ... and &func is a pointer to a function pointer object.
                ....
                Could you give me the type of func?
                See above. It's the first line of the message you were responding to.
                You say it's a pointer to a function pointer.
                No, I said that &func is a pointer to a function pointer. func itself
                is the function pointer that &func points at.
                Does it mean it's T (**)()?
                No, &func has type int (**)(double,int ).

                ....
                The question I answered was specifically about func, which is a
                function pointer object.
                ....
                Here you say func is a function pointer object, which contradicts what
                you said before.
                The first statement was about &func, the second statement was about
                func.
                & doesn't have an effect with function designators, however it does
                have for function pointers.
                Therefore, your code is correct and I was wrong. :-)
                Well, that would explain the confusion.

                Comment

                • Default User

                  #9
                  Re: Passing function pointers as arrays of chars

                  vippstar@gmail. com wrote:

                  I have a function: int (*func)(double, int).
                  Could you give me the type of func?
                  You already had it.



                  Brian

                  Comment

                  • vippstar@gmail.com

                    #10
                    Re: Passing function pointers as arrays of chars

                    On Oct 22, 10:44 pm, "Default User" <defaultuse...@ yahoo.comwrote:
                    vipps...@gmail. com wrote:
                    I have a function: int (*func)(double, int).
                    Could you give me the type of func?
                    >
                    You already had it.
                    Yes, but afterwards I explained in my post my confusion.
                    I have the habbit of writing my message as I read the other article,
                    which I think makes my messages somewhat unclear, so I'm trying to
                    stop doing it.

                    Comment

                    • Olaf Dietrich

                      #11
                      Re: Passing function pointers as arrays of chars

                      Nick Keighley <nick_keighley_ nospam@hotmail. com>:
                      On 22 Oct, 13:10, o...@dtrx.de (Olaf Dietrich) wrote:
                      >
                      >I may just be temporarily (hopefully ...) stupid, but how can
                      >I pass a function pointer between functions using an array of
                      >(signed/unsigned) chars (in a standard-conforming way)?
                      >
                      why do you want to do this? Some sort of callback function?
                      I was trying to pass a pointer to a C function (used for
                      non-linear numerical fitting) between Tcl commands. I can
                      easily pass arbitrary binary data as arrays of (unsigned)
                      chars using the available library "procedures " such as
                      Tcl_SetByteArra yObj(), but it's not possible to pass
                      function pointers directly (without defining any additional
                      new types of Tcl objects etc.)

                      It's best avoided if you can.
                      It's sort of quick and dirty, but it works (using
                      memcpy as suggested by James Kuyper).


                      Olaf

                      Comment

                      Working...