2015-02-03 3 views
0

라이브러리에 정의 된 함수를 구현하려고하는데이를 사용하는 데 문제가 있습니다. This 질문이 그것을 구현하는 데 도움이되지만 함수를 사용할 수 없습니다. 여기 void * 포인터를 사용하는 Typedef 함수

는 타입 정의입니다 :

typedef void (*paillier_get_rand_t) (void* buf, int len);

그리고 여기에 내가 그것을 구현하는 방법입니다

void get_rand(void* buf, int len) { 
    buf = (void *)rand(); // I don't know if it works but isn't the problem 
} 

그리고 여기가 내가 함수에 포인터를 생성하고 호출하는 방법.

int modulus = 4; 
    void* buf; 
    paillier_pubkey_t* pub; 
    paillier_prvkey_t* prv; 
    paillier_keygen(modulus, &pub, &prv, &get_rand);     

질문 1) 매개 변수 buf와 len은 어떻게 보냅니 까? 질문 2) 지금 오류가 다릅니다

reference to `paillier_keygen(int, paillier_pubkey_t**, paillier_prvkey_t**, void (*)(void*, int))' undefined 

함수 paillier_keygen 알고리즘에 대한 respectives 키를 생성하는데 이용되고, 함수 get_rand은 확률 적 알고리즘에 필요한 난수를 획득하기 위해 사용된다.

lib를 사용할 수 있기 때문에이 typedef를 구현하고 있습니다.

편집 :

이미 정의되어 하나 개의 기능을 발견하고 내가 paillier_get_rand_devurandom라고 할 수 있습니다.

/* 이러한 함수는 임의 숫자의 소스를 제공하기 위해 paillier_keygen 및 paillier_enc 함수에 전달 될 수 있습니다. 은 먼저/dev/random에서 바이트를 읽습니다. Linux에서이 장치 은 환경 소음에서 수집 한 엔트로피 만 독점적으로 반환하므로 은 충분하지 않을 때 자주 차단됩니다. 두 번째 은/dev/urandom에서 바이트를 반환합니다. Linux에서이 장치는 환경 노이즈도 으로 반환하지만 충분하지 않을 때는 의사 난수 으로 생성합니다. 후자는 아마도 이라고 생각되는 구체적인 이유가없는 한 더 나은 선택 일 것입니다. 나는 이런 식으로 사용하면 내가

paillier_keygen(modulus, &pub, &prv, paillier_get_rand_devurandom(buf, 4)); 

내가 error: invalid use of void expression

을 얻기 전에처럼 사용할 경우 */

void paillier_get_rand_devurandom(void* buf, int len); 

:

paillier_keygen(modulus, &pub, &prv, &paillier_get_rand_devurandom); 

를 내가 얻을 :

undefined reference to `paillier_get_rand_devurandom(void*, int)' 
undefined reference to `paillier_keygen(int, paillier_pubkey_t**, paillier_prvkey_t**, void (*)(void*, int))' 

라이브러리가 포함되어 있습니다. 여기 서명에 대한 자세한 정보를 추가합니다.

/* 제공된 get_rand 함수 의 임의성을 사용하여 길이 계수 비 트의 키 쌍을 생성합니다. 키 각각에 대해 공간이 할당되고 주어진 포인터는 새로운 paillier_pubkey_t 및 paillier_prvkey_t 구조를 가리 키도록 설정됩니다. paillier_get_rand_devrandom 및 paillier_get_rand_devurandom 함수는 이 최종 인수로 전달 될 수 있습니다.

void paillier_keygen(int modulusbits, 
      paillier_pubkey_t** pub, paillier_prvkey_t** prv, paillier_get_rand_t get_rand); 

/*이 */

은 확률 적 알고리즘에 필요한 난수를 획득하기 위해 사용되는 콜백 함수의 유형이다. paillier_get_rand_devrandom 및 paillier_get_rand_devurandom (나중에 설명 됨)은 paillier_get_rand_t가 필요한 라이브러리 함수로 전달 될 수도 있고 직접 구현할 수도 있습니다. 이러한 함수를 구현하면 배열 "buf"의 "len"임의 바이트를 채워야합니다. */

typedef void (*paillier_get_rand_t) (void* buf, int len); 
+1

'paillier_get_rand_t fnPtr = & getRand;를 시도하고'fnPtr'을 인수로 전달하십시오. –

+2

필자는'paillier_pubkey_t ** pub;'가 잘못되었다고 추측하고 대신'paillier_pubkey_t * pub; '를 사용하고'& pub'를 사용하여 함수에 전달해야합니다. (즉, 액세스 할 수있는 메모리에 대한 포인터를 예상하고 액세스하기 위해 무언가를 제공하고 있음). – crashmstr

+1

'buf = (void *) rand(); // 작동하는지는 모르지만 문제가되지는 않습니다. '확실히 의미가 없습니다. –

답변

2

해결책을 찾았습니다. 먼저 paillier.h이 C로 작성되었고 C++을 사용하기 때문에 extern과 같은 라이브러리를 가져옵니다. 다만이 같은

:

use #include <gmp.h> 
extern "C"{ 
    #include "paillier.h" 
} 

그 후 나는 또한 -lpaillier 또한 -lgmp 컴파일.

마지막 코드는 다음과 같습니다 추가 함수를 정의 할 필요가

paillier_pubkey_t* pub; 
    paillier_prvkey_t* prv; 
    paillier_keygen(1024, &pub, &prv, paillier_get_rand_devurandom); 

없습니다.

+0

동일한 문제가 발생하여 솔루션을 확인하는 것이 좋습니다. – 1a1a11a

2

모든 기능 (및 해당 설명서)의 프로토 타입을 보여주지 않기 때문에 내가 여기에 조금 같은데요,하지만 당신은 거의 확실이 대신 원하는 :

paillier_pubkey_t* pub; 
paillier_prvkey_t* prv; 
paillier_keygen(modulus, &pub, &prv, &get_rand); 
을 get_rand 아마 같은 일을 가진

: 당신은 역 참조하는

void get_rand(void* buf, int len) 
{ 
    char* bytes = (char*)buf; 
    for (int i = 0; i != len; ++i) { 
     bytes[i] = rand() & 0xff; 
    } 
} 
+0

그런데 왜 그가 그가 원하는 전부라면 'paillier_get_rand_t'를 typedef합니까? – ArtOfWarfare

+3

필자는'paillier' 라이브러리가 typedef를 선언하고 해당 함수를 구현하려고한다고 생각합니다. 관용적 인 C 인터페이스가 어떤 모습인지에 따라 몇 가지 추측을했습니다. – Cameron

+0

@Cameron이 맞습니다. 필자는 라이브러리'paillier'에 해당 함수를 구현하려고합니다. 나는 당신의 수정으로 얻는 더 많은 정보와 오류로 코드를 업데이트했다. – Niemand

1

와 get_rand_function의 가치를 호출은 다음을 진술 할 때 :

(*get_rand_funtion)(&buf, 4) 

선언 된 반환 형식이 void이므로 컴파일러는 식의 결과를 function 매개 변수의 유효한 형식이 아닌 void로 해석합니다. paillier_keygen 함수에 대한 포인터를 전달하고자한다면 @Cameron 코드가 맞습니다. 적어도 C99 및 이전 버전에서는 함수 포인터에 값을 바인딩 할 수 없습니다.

관련 문제