Функция Typedef с указателем void *
Я пытаюсь реализовать функцию, определенную в библиотеке, но у меня возникают проблемы с ее использованием. Этот вопрос помог мне реализовать его, но я не мог использовать эту функцию.
Вот тип определения:
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
используется для генерации соответствующего ключа для алгоритма и функции get_rand
используется для получения случайности, необходимой для вероятностных алгоритмов.
Я реализую этот typedef, потому что мне нужно сделать это, чтобы иметь возможность использовать lib.
РЕДАКТИРОВАТЬ:
Я нашел одну функцию, которая уже определена, и я могу использовать под названием paillier_get_rand_devurandom
,
/* Эти функции могут быть переданы в функции paillier_keygen и paillier_enc для предоставления источника случайных чисел. Первый читает байты из /dev/random. В Linux это устройство исключительно возвращает энтропию, собранную из окружающего шума, и поэтому часто блокируется, когда недостаточно. Вторая возвращает байты из / dev / urandom. В Linux это устройство также возвращает шум окружающей среды, но дополняет его генератором псевдослучайных чисел, когда недостаточно доступно. Последнее, вероятно, лучший выбор, если у вас нет особых причин полагать, что этого недостаточно. */
void paillier_get_rand_devurandom( void* buf, int len );
Если бы я использовал как раньше
paillier_keygen(modulus, &pub, &prv, paillier_get_rand_devurandom(buf, 4));
я получил error: invalid use of void expression
Если бы я использовал так:
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, или вы можете реализовать свою собственную. Если вы реализуете свою собственную такую функцию, она должна заполнить случайные байты len в массиве buf. */
typedef void (*paillier_get_rand_t) ( void* buf, int len );
3 ответа
Я нашел решение. Прежде всего я импортирую библиотеку как extern, потому что paillier.h написан на C, а я использую C++.
Именно так:
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);
Нет необходимости определять какие-либо дополнительные функции.
Я предполагаю немного здесь, потому что вы не показываете прототип всех функций (и их документацию), но вы почти наверняка захотите это:
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;
}
}
Вы разыменовываете и вызываете значение get_rand_function, когда утверждаете следующее:
(*get_rand_funtion)(&buf, 4)
Поскольку объявленный тип возвращаемого значения void, компилятор интерпретирует результат выражения как void, который не является допустимым типом для параметра функции. Если вы хотите передать указатель на функцию paillier_keygen, тогда код @Cameron правильный. По крайней мере, в C99 и ранее вы не можете привязывать значения к указателю на функцию.