2015-11-16 8 views
3

Я пытаюсь создать тестовую структуру в TCL, которая позволит мне выполнять скриптовые тесты на удаленном устройстве по TCP-сокету. Уже существует интерфейс Visual Basic и с SWIG в Ubuntu. Я повторно использую функции C, которые он вызывает, для создания общей библиотеки, которая будет работать как расширение для TCL.Функция Accessor для C-указателя в Swig

Устройство управляется с помощью процедур удаленного вызова C. Я могу отправлять сложные структуры в TCL и из TCL с помощью SWIG для переноса функций, вызывающих эти RPC. SWIG даже предоставит мне функции доступа, чтобы позволить мне создавать указатели на эти структуры, которые я могу использовать в функциях RPC. Однако я застреваю, когда хочу создать указатель на примитивы или отдельные элементы данных. В этом случае SWIG не создает функции доступа. Например, функция RPC может иметь прототип следующего вида:

rpc_testDefaults (testDefaults_t, *testDefaults, dataValid_t, *validStatus); 

Здесь *testDefaults представляет собой указатель на сложную структуру, и SWIG генерирует аксессоры функции вида new_testDefaults_t, delete_testDefaults_t, testDefaults_t_firstElement_set, testDefaults_t_firstElement_get т.д.

*validStatus является указателем на один элемент данных (uint32_t), но не генерируются функции доступа.

Мой файл интерфейс имеет вид:

// rpcTest.i 
%module rpcTest 
%include <stdint.h> 

%{ 
    #include "header.h" 
}% 

%include "header.h" 

Мой header.h определяет типы для testDefaults_t и dataValid_t.

В идеале, я мог бы включить флаг или что-то в файле интерфейса SWIG, который подскажет SWIG рассматривать все указатели так же, как структуры, с точки зрения создания аксессуаров.

Я получил доступ к данным в *validStatus, указав typedef для dataValid_t как единую структуру элементов, которая дает мне обычные функции доступа или использует cpointer.i и определяет тип в файле интерфейса, который дает мне другой набор функций доступа. Я бы предпочел, чтобы вам не приходилось идти ни на один из этих маршрутов, поскольку эта проблема будет происходить сотни раз в полной версии api, которая может быть изменена. Я также получил его для работы с использованием typemaps и назначения указателя в качестве вывода, но опять же я чувствую, что это добавляет утомительный код, и я бы предпочел использовать тот же набор функций доступа для управления этими данными.

Итак, есть ли способ автоматизировать обнаружение этих указателей и предоставить им функции доступа без необходимости писать сотни строк регулярного избыточного кода?

Любая помощь очень ценится.

ответ

1

В конце концов я нашел решение:

%pointer_functions(dataValid_t,validStatus) генерирует new_, Delete_, _assign и _value функции для одной части данных под названием validStatus. Я думал, что это только для структур. Я должен делать это каждый раз, когда сталкиваюсь с этой проблемой, но гораздо предпочтительнее изменять источник.