barbitoff programmer`s blog

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

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

Комментариев нет:

Отправить комментарий