2016-07-04 9 views
2

ライブラリlibusbは、USBデバイスへのクロスプラットフォームアクセスを提供します。 開始点は、接続されたUSBデバイスのリストを取得することです。 以下のコードはlibusbからそのようなリストを取得しようとしますが、クラッシュします。 問題にはlibusb_get_device_list の定義とタイプ_libusb_device_list**のものがありますが、他のものも間違っている可能性があります。libusbのFFI:リンクリスト

libusb_get_device_listを正しく定義するにはどうすればよいですか?

C関数のドキュメントはこちらです:http://libusb.sourceforge.net/api-1.0/group__dev.html#gac0fe4b65914c5ed036e6cbec61cb0b97

#lang racket/base 
;;; FFI for libusb version 1.0. 

(require ffi/unsafe 
     ffi/unsafe/define) 

;;; Types 

(define _ssize_t _ssize) ; signed version of _size_t 

;;; Load the shared library 

(define libusb 
    (case (system-type) 
    [(macosx) (ffi-lib "/usr/local/lib/libusb-1.0.0.dylib")] 
    [else  (error "Contact maintainer")])) 

;;; Create define-usb which makes it easy to define functions from libusb 
(define-ffi-definer define-usb libusb) 

; ssize_t libusb_get_device_list(libusb_context *ctx, libusb_device ***list) 

(define _libusb_context  (_cpointer/null 'libusb-context)) 
(define _libusb_device_list** (_cpointer 'device_list**)) 

(define-usb libusb_get_device_list (_fun (ctx    : _libusb_context) 
              (linked-list  : (_ptr o _libusb_device_list**)) 
             -> (number-of-devices : _ssize_t) 
             ; output wrapper: 
             -> (list number-of-devices linked-list))) 

; Returns a list of USB devices currently attached to the system. 
; Unreference all devices, then free the list using libusb_free_device_list. 
; A null context gives the default context. 

; (libusb_get_device_list #f) 

答えて

3

あなたの署名が正しいか(自分の引数名はかなりありませんが、右出力パラメータがNULL - 末端配列ではなく、リンクリストです) 。ただし、libusbでは、コンテキストを使用しない場合でもlibusb_initを呼び出す必要があります。 libusb_initNULLと呼ぶと、デフォルトのコンテキストが初期化されます。

(define-usb libusb_init/default (_fun (_pointer = #f) -> _int) 
    #:c-id libusb_init) 

(libusb_init/default) 

...またはそれ以降のlibusb_get_device_listに提供できるコンテキストを生成するためにそれを呼び出す:

(define-usb libusb_init (_fun (ctx : (_ptr o _libusb_context)) 
           -> (status : _int) 
           -> (values ctx status))) 

(define-values [ctx status] (libusb_init)) 
あなたはデフォルトコンテキストを初期化するために NULLlibusb_initを呼び出すためにどちらかの必要