C通过改变其评估点

时间:2017-01-28 13:14:32

标签: c function pointers

我正在编写一个C程序来模拟跳转过程。在某些情况下,通过改变其评估点,可以很容易地从一个共同函数计算不同状态之间的跳跃率。所以我希望能够获取给定的函数指针并移位并分配一个函数指针,该函数指针表示原始函数的移位版本。

经过一个小时的在线搜索,我还没有找到解决方案,而且我相信这实际上并不在传统C的范围内。是否有人有一个解决方案或想法采用不同的方法来获取原始功能并可以访问移位版本?

在一个最小的例子之下,感觉被邀请将测试变为绿色:)

#include "gtest/gtest.h"

int f(int x) {
    return x;
}


void get_shifted_funtion(int (*pOriginalFunction)(int), int (*pShiftedFunction)(int), int shift) {
    ??? 
}

TEST(FunctionTest, GenerateAShiftedVersionOfAGivenFunction) {
    int (*fp)(int);
    int (*sfp)(int);
    fp = f;
    int shift = 2;
    int test_value = 0;
    get_shifted_funtion(fp, sfp, shift);
    EXPECT_EQ(fp(test_value+shift), sfp(test_value));
}

编辑:@MSalters实施提案,以显示解决问题的C方式。很高兴听到有关改善这一点的建议。

typedef struct STATEFUL_FUNCTION {
    int (*fp) (int);
    int shift;
} stateful_function;

int evaluate(STATEFUL_FUNCTION func, int input) {
    return func.fp(input + func.shift);
}

int test_function(int x) {
    return x;
}

TEST(FunctionTest, GenerateAShiftedVersionOfAGivenFunction) {
    int test_input = 0;
    int shift = 2;
    STATEFUL_FUNCTION sf = {test_function, shift};

    EXPECT_EQ(test_function(test_input+shift), evaluate(sf, test_input));
}

2 个答案:

答案 0 :(得分:2)

不行。 C函数是无状态的。通常你可以通过创建一个包含两个成员,一个函数指针和所需状态的结构来解决这个问题。在这种情况下,我不确定为什么你甚至想要首先存储一个函数指针。你总是调用相同的功能(对吗?)所以你需要存储的就是评估点。

答案 1 :(得分:0)

说实话我不确定你的意思是“移位”,但是从听起来你想要状态到你的功能指针这一事实判断,我最近发现了一篇可能对你感兴趣的帖子: http://nullprogram.com/blog/2017/01/08/

但它需要以编程方式将程序集写入可执行内存,这意味着它不是纯C解决方案(不可移植)。

希望这有所帮助,祝你好运:)