我正在尝试在代码中使用此功能,以在所有其他保存的打印件中执行搜索,以了解员工是否确实检查了他的出入,但每次我调用此功能时仍会遇到细分错误然后程序关闭,它要求我放开手指,一旦完成扫描,它就会崩溃。我正在gtk + -2.0 C ++程序中完成所有这些工作。
这是我尝试使用的https://fprint.freedesktop.org/libfprint-stable/ API的页面
我已经尝试从C调用此函数
这是代码的一部分,在运行注册过程并且fpdev中的设备已启用之后,我尝试识别edlg_enroll_data的指纹
这就是我声明变量的方式
struct fp_dev *fpdev = NULL;
static struct fp_print_data *edlg_enroll_data = NULL;
这是我初始化设备的方式
static gboolean enable_device()
{
struct fp_dscv_dev **discovered_devs;
discovered_devs = fp_discover_devs();
if (!discovered_devs)
return FALSE;
g_assert(discovered_devs);
if (discovered_devs[0]){
fpdev = fp_dev_open(discovered_devs[0]);
fp_dscv_devs_free(discovered_devs);
return TRUE;
}
return FALSE;
}
这就是我初始化edlg_enroll_data
的方式static void edlg_run_enroll_stage()
{
int r;
int passed = 0;
struct fp_img *img = NULL;
gchar *tmp;
while (gtk_events_pending())
gtk_main_iteration();
r = fp_enroll_finger_img(fpdev, &edlg_enroll_data, &img);
if (r < 0) {
return;
}
相同的设备和相同的fp_print_data在其他功能中正常工作
struct fp_print_data **gallery;
gallery = (fp_print_data**)malloc(sizeof(*gallery) * (2));
gallery[0]=edlg_enroll_data;
gallery[1]=NULL;
size_t *size = 0;
return fp_identify_finger(fpdev, gallery, size);
and can't get past that identify function
我希望该函数返回一个Int(例如1)并保存与我提供的图库中匹配的指纹的位置。我认为唯一的可能是初始化画廊的方式。
答案 0 :(得分:0)
您与之相关的fpdev
和edlg_enroll_data
仍然是NULL
指针,除非它们在您未显示的代码中初始化。假设它们已初始化,则您的fp_identify_finger
函数具有以下声明:
int fp_identify_finger (struct fp_dev *dev, struct fp_print_data **print_gallery, size_t *match_offset);
参数定义为:
dev the device to perform the scan. print_gallery NULL-terminated array of pointers to the prints to identify against. Each one must have been previously enrolled with a device compatible to the device selected to perform the scan. match_offset output location to store the array index of the matched gallery print (if any was found). Only valid if FP_VERIFY_MATCH was returned.
如果dev
(您的fp_dev
)或print_gallery[0]
(您的gallery[0]
)没有正确地初始化和验证,这很容易导致SegFault。
此外,Gtk + 2是C API,用于使用C编译器而不是C ++进行编译。进一步建议您在Gtk +程序内进行分配时使用g_malloc ()
或g_slice_new()
,因为不必检查分配的返回值,因为程序会在分配失败时终止。
对于您来说,在使用存储之前,您甚至都不会检查对malloc
的调用是否成功(可能根本没有分配过,在这种情况下也可能会出现SegFault)。需要强制返回malloc
的返回值,则没有必要。参见:Do I cast the result of malloc?
在没有A Minimal, Complete, and Verifiable Example (MCVE)的情况下,这是我可以提供的关于SegFault可能来源所在的最佳想法。如果您未能验证fpdev
和edlg_enroll_data
的初始化,同样无法验证gallery
的指针分配是否成功,则很可能失败了在其中一个地区。
答案 1 :(得分:0)
好了,我解决了这个问题,在传递参数来存储找到的指纹的位置时,我缺少一个&:
return fp_identify_finger(fpdev, gallery, &size);
这解决了它。