Функция ptr назначает приведение типов - PullRequest
0 голосов
/ 19 февраля 2019

Пытаюсь сделать следующее: я не уверен - правильно ли это.В качестве альтернативы мне, возможно, придется написать функцию Wrapper, но я бы хотел найти лучший способ.Кроме того, в будущем другой разработчик хотел бы использовать хеш-функцию из другой библиотеки, платформы, в зависимости от требований к производительности для различных целей.

Созданная структура:

typedef struct Hashctx{
    char inStream[BUFSIZ];
    char outHash[MAX_HASH];
    int (*Hashing)(char* DstBuf, size_t DstBufSize, \
           size_t *olen, char* SrcBuf, size_t SrcBufSize);
}Hashctx;
Hashctx App1;

И попытаться инициализировать следующим образом:

init()
{
#ifdef PLATFORM
    App1.Hashing = SHA1sumPlatform;
#elif
    App1.Hashing = SHA1sum;
#endif
}

Хотя аргументы, принимаемые обеими функциями, одинаковы, тип возвращаемого значения отличается.Я застрял с ошибками cannot assigned be entity of type ... и no definition for App1

int SHA1sum(...)
uint32_t SHA1sumPlatform(...)

Я попытался выполнить типографскую обработку, также не устраняя ошибку

Hashing = (int)SHA1sumPlatform;

Спасибо

1 Ответ

0 голосов
/ 19 февраля 2019

В этой строке Hashing = (int)SHA1sumPlatform; Вы пытаетесь привести function pointer к int, что не является правильным способом приведения указателя функции.

Если вы уверены, что int являетсяправильный тип возвращаемого значения, который вы хотите, затем выполните следующим образом:

typedef int (*HashingFnType)(char* DstBuf, size_t DstBufSize, \
           size_t *olen, char* SrcBuf, size_t SrcBufSize); 

typedef struct Hashctx{
    char inStream[BUFSIZ];
    char outHash[MAX_HASH];
    HashingFnType Hashing ;
}Hashctx;

init()
{
#ifdef PLATFORM
    Hashing = (HashingFnType)SHA1sumPlatform;
#elif
    Hashing = (HashingFnType)SHA1sum;
#endif
}

Примечание. Чтобы привести указатель на функцию с различными типами, оба типа должны быть совместимы.Подробнее об этом здесь .

...