2017-01-28 1 views
2

저는 점프 프로세스를 시뮬레이션하기 위해 C 프로그램을 작성하고 있습니다. 어떤 경우에는 각기 다른 점 사이의 점프 율은 평가 점을 이동시켜 공통 함수로 계산하기 쉽습니다. 그래서 주어진 함수 포인터를 가져 와서 원래 함수의 이동 된 버전을 나타내는 함수 포인터를 할당하고 할당하고 싶습니다.C는 평가 점을 이동하여 함수의 복사본을 생성합니다.

한 시간 동안 온라인 검색을 한 후에도 해결책을 찾지 못했지만이 사실은 전통적인 C의 범주에 실제로 해당되지 않는다고 확신합니다. 원본을 가져 오는 다른 접근 방식에 대한 해결 방법이나 아이디어가있는 사람이 있습니까? 함수 및 이동 된 버전에 대한 액세스 권한이 있습니까? 문제를 해결하는 C 방법을 보여 @MSalters의 제안의 구현 : 최소한의 예를 아래

는 녹색 테스트 :

#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)); 
} 

편집을 얻기 위해 초대 느낌. 이것을 개선하기위한 제안에 대해 듣고 기쁘게 생각합니다.

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

작동하지 않습니다. C 함수는 stateless입니다. 일반적으로 두 멤버, 함수 포인터 및 원하는 상태로 구조를 생성하여이를 해결할 수 있습니다. 이 경우, 왜 첫 번째 장소에 함수 포인터를 저장해야하는지 확실하지 않습니다. 당신은 항상 같은 기능을 호출하고 있습니다 (맞습니까?) 그래서 당신이 저장해야하는 것은 그 평가 포인트입니다.

+0

약간의 자체 생성 문제입니다. 점프 프로세스를 설명하는 구조를 설계했습니다. 점프 프로세스는 일련의 반응을 보유하고 각 반응은이 반응의 현재 속도를 계산하는 함수 포인터를 보유합니다. 이제 내가 배우고 싶은 특정 점프 프로세스의 경우,이 함수가 단일 함수와 상태 종속 교대를 따르므로 모든 함수를 명시 적으로 언급하는 것을 피하고 싶습니다. –

+0

하지만이 막 다른 골목은 사용자 친화적이지 않은 점프 프로세스 구조를 설계하기위한 표시 일 뿐이며 다시 생각해 볼 것입니다. –

0

솔직하게 말하면 "shift"로 무엇을 의미하는지 모르겠지만 함수 포인터로 상태를 원하는 것처럼 들린다는 사실로 판단하면 최근 흥미로운 부분이있을 수 있습니다. 당신 : http://nullprogram.com/blog/2017/01/08/

그러나 이것은 실행 가능 메모리에 프로그래밍 방식으로 어셈블리를 작성해야하므로 순수한 C 솔루션 (휴대용이 아닙니다)을 의미합니다.

호프 도움이, 행운을 빕니다 :)

+0

이동 : 주어진 f : int -> int, g (x) = f (x + c) g 포인터를 갖고 싶습니다. 고마워, 아주 흥미로운 소스,하지만 이것은 다소 복잡한 접근 방식을 보여줍니다 :) –