Я использую Ffidl для работы с некоторыми устройствами, которые используют драйверы FTDI, и по большей части все это работает довольно хорошо. Я совершенно уверен, что область, в которой я терплю неудачу, проистекает из моего непонимания того, как TCL обрабатывает указатели за кулисами. В любом случае, я получил примеры, касающиеся функций, которые передаются по ссылке на работу, выполняя что-то вроде этого:
::ffidl::callout rpbrd {pointer-var} int \
[ffidl::symbol [ffidl::find-lib library] returns_pass_by_reference_double]
set dbl_ptr = [binary format [::ffidl::info format double] 1]
set my_int = [rpbrd dbl_ptr]
binary scan $dbl_ptr [::ffidl::info format double] my_dbl
puts $my_dbl
Однако две вещи, которые мне еще не удалось выяснить, - это возвращаемые строки "по ссылке" (char *
), потому что они, кажется, всегда возвращают некоторые ненужные данные всякий раз, когда я пробую описанный выше подход, а также что-либо еще делать с массивами, потому что я даже не знаю, с чего начать, чтобы заставить их работать. Я почти уверен, что процесс, стоящий за этими двумя, будет похожим, поскольку один - это массив символов, а другой - просто массив ... ну, что-то еще.
Любая помощь в выяснении этого очень ценится. Я работал над этим в течение нескольких дней, и мой Google-фу не работает при поиске действительно хороших примеров, связанных с ffidl.
Редактировать: со времени моего поста мне с трудом удалось заставить работать строки, используя команду ::ffidl::pointer-into-string
. Который в основном просто смотрит на память и копирует байты, пока не достигнет нулевой точки (я предполагаю). Это не то, что я считаю оптимальным методом, потому что кажется, что он не работает по ссылке, поскольку я не могу передать указатель по ссылке на определенное место в памяти и просто ожидать, что он будет работать без последствий. (Если мне неясно, в основном я буду выбирать случайный субадрес в моем текущем блоке памяти и говорить: «Хм, да. Кажется, это хорошее место, чтобы просто поместить некоторые данные». что действительно плохая идея.)
Я собираюсь продолжать пыхтеть, пытаясь выяснить, как заставить работать массивы. Начиная с копирования памяти и пытаясь поработать магией байтов с некоторыми binary scan
s.