barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)
Показаны сообщения с ярлыком js-ctypes. Показать все сообщения
Показаны сообщения с ярлыком js-ctypes. Показать все сообщения

четверг, 8 декабря 2011 г.

js-ctypes: получение значений по указателям, передача в функцию адреса переменной и возврат из функции указателя на массив.

Если переменная ptr была создана как указатель, скажем, на int:
var ptr = new ctypes.int.ptr;
то получить её значение можно (естественно, если она была передана в какую-то функцию по адресу, т.к. иначе этот указатель будет NULL и пытаться получить что-либо по нему бессмысленно) следующим образом:
ptr.contents
Это свойство вернет объект CData, представляющий значение по этому указателю, а собственно само целочисленное значение можно получить через свойство value этого объекта:
ptr.contents.value
Для передачи переменной ptr в функцию по адресу необходимо вызвать метод address() для неё:
someCFunction(ptr.address())
Эта функция сможет установить указатель ptr куда-либо, откуда потом данные можно считать.
Единственное, чего я не понял - если возвращаемый указатель указывает на массив, как получить доступ к элементам массива, кроме первого. ctypes.cast() к типу массива выполнить не получается (даже задавая размер массива при создании массивного типа равным реальному размера массива по возвращенному указателю), передавать в функцию вместо двойного указателя указатель на массив тоже не выходит - ругается ctypes. При возврате из функции указателя (не через аргумент, а обычным return) объявить в JS эту функцию как возвращающую не указатель, а массив, тоже не удается - пишет, что "Return type cannot be an array or function" (ну собственно как и в C, возвращать массив нельзя).
Пришлось в C делать отдельную функцию, которая вытягивает элементы из массива по индексу, не оптимально, но это единственный вариант, который я вижу.

пятница, 28 октября 2011 г.

js-ctypes в Firefox 3.6

В Firefox 3.6 и Gecko 1.9.2 js-stypes ещё был немного недоразвит, но всё же работоспособен.
Для передачи C-функции параметров-строк (или для возврата строк), использующих Юникод (т.е. wchar на стороне C), можно использовать ctypes.ustring вместо появившегося позже типа ctypes.jschar.ptr.
Также в 3.6 нет вообще указателей, т.е. нельзя получить из типа указатель на него, обратившись к полю ptr, и мне кажется, что обойти это ограничение нельзя.
Для типов ctypes.int и ctypes.long имеются аналоги ctypes.int16_t и ctypes.int32_t.