2011-09-28 2 views
3

이것은 매우 기본적인 질문 일 가능성이 높습니다. 죄송합니다.서명이있는 인수에 대한 기본적인 질문 void * data

나는 C 엔진으로 구동되는 C++ 인터페이스를 작성했다. 는 C 엔진 기능 중 하나는 다음과 같은 특성을 갖는다 :

static int f(double t, double *y, double *ydot, void *data) 

*data 꼬는 ODE 솔버에 사용자 데이터를 전달하는 것이다. 이제는 C에서 간단히 struct을 만들고 내 데이터로 초기화 한 다음 전달합니다. C++에서는 사용자 데이터가 들어있는 클래스를 만들고 이전에 struct을 전달한대로 전달하려고합니다. structsclasses입니다. 나는 그것을 할 때

그러나, 다음과 같은 상황이 발생합니다

  1. void *data 표기가 무엇을 의미 하는가 :

    int.cpp:25: error: no matching function for call to ‘UserData::UserData()’ 
    int.cpp:13: note: candidates are: UserData::UserData(double) 
    int.cpp:5: note:     UserData::UserData(const UserData&) 
    int.cpp:28: error: ‘void*’ is not a pointer-to-object type 
    int.cpp:29: error: ‘void*’ is not a pointer-to-object type 
    

    내 질문은 다음과 같습니다?

  2. 내가 적절한 서명이있는 생성자가 없다는 불만이있는 이유는 무엇입니까?

분명히 나는 ​​매우 신참이기 때문에 매우 유감 스럽지만 미안하지만 문제를 (Google 자체 검색 이외에) 어떤 문제를 Google에 사용할지 모르겠다.

감사합니다.

편집 : 이전 질문의 모호성에 대해 사과

. 또한, 나는 그 문제를 해결했고 그것은 매우 어리석은 실수였다.

나는 포함하는 클래스 매개 변수했다 :

class Data{ 
// an interface to get parameters 
}; 

을하고 내가 잘못이 한

static int f(double t, ...., void *user_data) 

서명이있는 C 함수를 호출하는 데 필요한 :

static int f(double t, ...., void *user_data){ 
Data *data = (Data*) data; /* this is the stupid mistake */ 
} 

을 때 나는 이 작업을 수행하기위한 것입니다 (현재 작동 함) :

static int f(double t, ...., void *user_data){ 
Data *data = (Data*) user_data; /* this is the correction */ 
} 

감사합니다. void *data의 정확한 의미를 알려 주시면 감사하겠습니다.

+4

오류 메시지가 나타내는 코드를 게시해야합니다. –

+2

"그것을 시도 할 때"우리에게 "그것이 무엇인지"를 말하지 않고 말하지 마십시오! –

답변

3
void *data 

은 임의의 주소에 대한 포인터를 의미합니다. 임의의 형태의 데이터를 건네주는 비 형식 안전 방식입니다. C++에서 function object을 사용하여 수행 할 작업을 구현하는 것이 일반적인 패턴입니다. data 매개 변수는 ODE 해석기가 실제로 사용하는 것이 아니라 사용자가 제공하는 콜백을 사용합니다. 당신과 콜백은 ODE 해결자가 무엇을 가리키는 지 알 필요가 있습니다. 해석기는 주소를 콜백 함수에 전달합니다.

으로 간단한 예제, 라이브러리가 하나의 변수

엔 params 기능은 당신에게 매개 변수가있는 함수를 작성할 수있는 기능을 제공
typedef double (*valuation_function) (double x, void * params); 
    double find_root(valuation_function fn, double lower, double upper, void* params); 

에서 함수의 뿌리를 찾을 수있는 기능을 가지고 가정합니다. 선의 근원을 찾고 싶다고합시다.

struct Line { 
    double slope; 
    double intercept; 
    public: 
    Line(double s, double i) : slope(s), intercept(i) {} 
}; 

double a_line(double x, void *params) { 
    Line* line = (Line *)params; 
    return line->slope * x + line->intercept; 
} 

그런 다음 모든 행에 대해 find_root 함수를 호출 할 수 있습니다. 행 fortyFive (1.0, 0.0); find_root (a_line, forty5);

examples에 대해 gsl 라이브러리를 볼 수 있습니다.

+0

사실 심각한 코드에서는 콜백이 될 수 없습니다. 왜냐하면 void 포인터는 함수 포인터와 호환되지 않기 때문입니다. 그러한 경우라면, 그것은'void (*) (void *) '또는 무엇인가와 같아야합니다. –

+0

감사합니다! 이것은 나를 올바른 길로 인도합니다. 10 년이 더 지나면 비교적 좋은 모양이 될 것입니다.) – Escualo

+0

@kerrek : 그는 "콜백으로 사용했습니다"라고 말하면서 콜백이 아니라고 말했습니다. –

관련 문제