Я пытаюсь создать тестовую структуру в 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 и назначения указателя в качестве вывода, но опять же я чувствую, что это добавляет утомительный код, и я бы предпочел использовать тот же набор функций доступа для управления этими данными.
Итак, есть ли способ автоматизировать обнаружение этих указателей и предоставить им функции доступа без необходимости писать сотни строк регулярного избыточного кода?
Любая помощь очень ценится.