2013-04-19 2 views
0

libfprint를 사용하여 C++에서 간단한 지문 스캐닝 프로그램을 작성하려고 시도하지만 간헐적으로 실행할 때 세그 폴트가 발생합니다. Valgrind는 오류가 fp_enroll_finger에 대한 호출에서 디버깅과 일관성이 있다고 말합니다.하지만이 오류의 원인을 전혀 알지 못합니다. 프로그램이 잘 돌아가는 경우도 있지만 프로그램이 실행될 때마다 일정 시간 동안 지속적으로 segfault하는 것으로 보입니다. 을 Heres 코드 :지문 호출로 인해 세그 폴트가 C++에서 발생합니다

#include <iostream> 

extern "C" 
{ 
    #include <libfprint/fprint.h> 
} 

using namespace std; 

fp_dev * fpdev; 
fp_print_data ** fpdata; 

bool createDevice(); 

int main(int argc, char **argv) 
{ 
    int r = fp_init(); 
    if(r != 0) 
    { 
     return r; 
    } 

    while(createDevice()) 
    { 
     cout << "Scan right index finger" << endl; 
     int enrollStatus = fp_enroll_finger(fpdev, fpdata); 

     if(enrollStatus != 1) 
     { 
      cout << "Bad scan" << endl; 
      fp_dev_close(fpdev); 
     } 
     else 
     { 
      cout << "Good scan" << endl; 
      fp_print_data_save(fpdata[0], RIGHT_INDEX); 
      break; 
     } 
    } 

    if(fpdev != NULL) 
    { 
     fp_dev_close(fpdev); 
    } 

    fp_exit(); 
    return 0; 
} 

bool createDevice() 
{ 
    fp_dscv_dev ** listOfDiscoveredDevs; 
    fp_dscv_dev * discoveredDevice; 
    listOfDiscoveredDevs = fp_discover_devs(); 
    discoveredDevice = listOfDiscoveredDevs[0]; 

    if(discoveredDevice != NULL) 
    { 
     cout << "Device found" << endl; 
     fpdev = fp_dev_open(discoveredDevice); 
    } 
    else 
    { 
     cout << "No device found" << endl; 
     return false; 
    } 

    fp_dscv_devs_free(listOfDiscoveredDevs); 
    return true; 
} 
+0

fpdata에 데이터가 할당되어 있어야합니까? 또한 fpdev를 닫은 후에는 NULL로 설정하십시오. 그렇지 않으면,'fp_enroll_finger'가 1을 반환하지 않을 때 두번 닫을 것입니다. – jeffmagill

답변

2
당신은 fpdev를 정의 할 필요가

fpdata 등 :

fp_dev * fpdev; 
fp_print_data * fpdata; 

하고 사용이 같이

fp_enroll_finger(&fpdev, &fpdata); 

또한 무료 fpdata에 잊지 말고 때를 더 이상 필요하지 않음 fp_print_data_free

fp_dev * fpdev; 
fp_print_data ** fpdata; 

fp_enroll_finger이 해당 위치에 액세스하려고 시도하면 임의의 메모리 위치를 가리키고 segfault로 이어지는 2 개의 초기화되지 않은 포인터를 생성합니다. fp_enroll_finger 반환 값을 확인하는 것도 유용 할 수 있습니다.

+0

위의 이유가 필요한 이유는 포인터 (솔루션)가 메모리 공간을 할당하지 않기 때문입니다. 이 솔루션은 메모리를 할당 한 다음이 메모리의 주소 (포인터 만들기)를 사용하기위한 함수에 전달합니다. –