2013-10-10 2 views
0

Обычно C указатели API переводятся либо arrays или out параметров в Vala привязок:Как связать задержанный параметр?

// C 
void get_user_name (char *buffer, int buffer_length); 
void get_user_count (int *count_ptr); 
// Vala 
public static void get_user_name (uint8[] buffer); 
public static void get_user_count (out int count); 

Я теперь попадались случае, когда указатель используется в качестве задержанного out параметра.

// C 
void bind_buffer (void *buffer, int buffer_length, int *length); 
int fetch (void); 

Каждый раз, когда fetch() называется, данные передаются buffer и length.

Каков наилучший способ привязки такого API в Вала?

// Vala 
public static void bind_buffer (uint8[] buffer, int *length); 
public static int fetch(); 

Я не думаю, что могу использовать out int length здесь?

Также я должен убедиться, что связанные данные доступны все время, пока они все еще связаны. Как я могу это достичь?

ответ

1

Вы в основном правы с этим последним примером. Аннотации CCode немного неактивны (по умолчанию массив_length равен true, вам не нужно включать его, а array_pos не существует. Существует массив_length_pos, но опять же, это фактически не требуется, поскольку значение по умолчанию будет работать нормально). Указатель - это единственный путь в этой ситуации для длины.

Что касается обеспечения доступности данных, это не похоже на то, что C API дает вам способ сделать это. Как правило, это достигается путем передачи права собственности, но для этого требуется, чтобы API-интерфейс C предоставлял возможность автоматически уничтожать/отменять данные, когда это больше не требуется. Единственное, что вы можете сделать, это попытаться убедиться, что потребитель VAPI знает о том, что они сохраняют данные до тех пор, пока это необходимо.

Vala имеет тенденцию работать очень хорошо с хорошо разработанными API-интерфейсами C, но при работе с плохо разработанными API-интерфейсами C не всегда можно создать хороший API Vala. Ваши единственные реальные возможности - либо улучшить библиотеку C, либо написать библиотеку-оболочку (либо в C или Vala), которая проксирует вызовы API C, предоставляя более здравый API.

+0

Я удалил атрибуты CCode для моего вопроса, так как они здесь не актуальны (как вы писали). –

+0

В API есть еще более безумные вещи (например, void *, которые принимают другие указатели в зависимости от параметров типа): \ –

+1

Возможно, вы захотите использовать общие для них или, возможно, создать версию для каждого типа со значениями по умолчанию для типа. – nemequ

Смежные вопросы