Кажется, что функция, возвращающая двойной тип данных из libffi, неправильно приводится, когда функция возвращает свое значение, вот код, который я использовал:
#include <stdio.h>
#include <stdlib.h>
#include <ffi.h>
#include <math.h> // The make call the function `cos` by the FFI.
int main()
{
ffi_cif cif;
ffi_type *args[1];
void *values[1];
ffi_arg rc;
args[0] = &ffi_type_double;
void *ptr = malloc(sizeof(double));
*((double *)ptr) = 3.0;
values[0] = ptr;
if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_double, args) == FFI_OK)
ffi_call(&cif, cos, &rc, values);
printf("%f\n", (double)rc);
return 0;
}
Результат выглядит следующим образом: 13830464316077631000.000000
.
Тип ffi_arg
является псевдонимом для unsigned long long
. В документации говорится, что аргумент типа ffi_arg
, передаваемый в функцию ffi_call
, используется для хранения данных, если они меньше sizeof(ffi_arg)
, в противном случае это указатель на данные в памяти:
rvalue должно указывать на хранилище, которое sizeof(ffi_arg)
или больше для типов без плавающей запятой. Для типов возвращаемых значений меньшего размера для хранения возвращаемого значения должен использоваться интегральный тип ffi_arg
или ffi_sarg
.
(https://manpages.debian.org/testing/libffi-dev/ffi_call.3.en.html)
Итак, я попробовал это с разыменованием указателя:
void* rc;
// The code to call the function and initialize the CIF...
double my_value = *(double *)((void *)rc);
, что привело к сбою программы.
Как мне получить доступ к значению, хранящемуся с помощью переменной rc
?
РЕДАКТИРОВАТЬ 1
Командная строка, используемая для компиляции программы:
gcc source.c -lffi -o source
Нет ошибок или предупреждений во время компиляции.
РЕДАКТИРОВАТЬ 2
После добавления опции сборки `-Wall 'я получаю:
warning: passing argument 2 of 'ffi_call' from incompatible pointer type [-Wincompatible-pointer-types]
ffi_call(&cif, cos, &rc, values);
^~~
Это предупреждение, похоже, игнорируется в libffi пример . Приведенный пример работает очень хорошо для меня (с этим предупреждением).