将函数指针作为字符数组传递 [英] Passing function pointers as arrays of chars

查看:110
本文介绍了将函数指针作为字符数组传递的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可能只是暂时(希望......)愚蠢,但怎么可以

我使用

(有符号/无符号数组)的数组传递函数之间的函数指针)chars(以符合标准的方式)?

例如:


我有一个函数:int(* func)(double,int)。


现在我想存储地址。这个函数是一个数组(足够大小)的字符,例如
,例如在

char func_addr [100]。 (我怎么能这样做?)


最后我想在另一个

函数指针中使用这个地址:

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


这不起作用 - gcc抱怨:ISO C禁止转换

指向函数指针类型的对象指针。

有没有办法在构造数组中存储构成函数的数据

指针(不需要

一个对象指针的大小)?然后再将这个序列重新解释为
字节作为函数指针?

感谢任何建议

Olaf

解决方案

Olaf Dietrich写道:


我可能只是暂时(希望......)愚蠢,但是怎么能

我使用

(有符号/无符号)字符数组(以符合标准的方式)传递函数之间的函数指针?


例如:


我有一个函数:int(* func)(double,int)。


现在我我希望存储地址。这个函数是一个数组(足够大小)的字符,例如
,例如在

char func_addr [100]。 (我怎么能这样做?)



char func_addr [sizeof func];

memcpy(func_addr,& func,sizeof func) ;


最后我想在另一个

函数指针中使用这个地址:

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



memcpy(& new_func,func_addr,sizeof new_func);


这不起作用 - gcc抱怨:ISO C禁止转换

指向函数指针类型的对象指针。



那是因为你试图转换func_addr,在这种情况下

衰变为指向第一个char的指针那个数组,成为指向

a函数的指针。你想要它做的是解释那个

数组的内容,好像它是一个指向函数的指针。这种

转换的语法(安全)是:


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


这将func_addr从指向char数组的指针转换为

指向函数指针的指针,然后取消引用该指针,获取

a函数指针。不幸的是,这不是一个安全的方法来使用,因为不能保证func_addr正确对齐

持有这样的指针。如果func_addr

是指向动态分配的char数组的指针,或者如果func_addr

是具有相应函数指针类型的并集的一部分,则可以保证正确对齐。


James Kuyper< ja ********* @ verizon.net>:


Olaf Dietrich写道:


>现在我想存储地址。这个函数在一个数组(足够大小)的字符中,例如,在
char func_addr [100]。 (我怎么能这样做?)



char func_addr [sizeof func];

memcpy(func_addr,& func,sizeof func) ;


>最后我想在另一个
函数指针中使用这个地址:



memcpy(& new_func,func_addr,sizeof new_func);



多么明显和简单......(甚至可以工作)。


非常感谢您的帮助

Olaf


10月22日13:10,o ... @ dtrx.de(Olaf Dietrich)写道:
< blockquote class =post_quotes>
我可能只是暂时(希望......)愚蠢,但怎么能

我使用数组
传递函数之间的函数指针
(签名/未签名)字符(符合标准的方式)?



你为什么要这样做?某种回调功能?

如果可以,最好避免使用。


< snip>


-

Nick Keighley


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

解决方案

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_addr, &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_func, 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.


James Kuyper <ja*********@verizon.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_addr, &func, sizeof func);

>And finally I would like to use this address in another
function pointer:


memcpy(&new_func, func_addr, sizeof new_func);

How obvious and simple ... (and it even works).

Thank you very much for your help
Olaf


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


这篇关于将函数指针作为字符数组传递的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆