Согласно документации, вы должны использовать вместо этого тип bytes
(когда вы получаете указатель на структуру с полем len
с количеством байтов в нем и полем s
, котороеуказатель на фактический только для чтения блок байтов. (Как char *
, а не unsigned char *
по причинам, которые я не знаю. И почему это не const
- еще одна загадкаменя, есть случаи, когда это действительно так, но вам нужно посмотреть на поле o
, чтобы понять это.
Чтобы вернуть байтовый массив, вы используете object
(или object0
) тип результата и создайте объект с, например, Tcl_NewByteArrayObj()
, или Tcl_NewObj()
и Tcl_SetByteArrayLength()
.
Вот пример (только определение команды), который выполняет тривиальное обращение байтов (так как я невообще не понимаю кривые Z-порядка):
critcl::cproc example {bytes dataPtr} object0 {
Tcl_Obj *result = Tcl_NewObj();
unsigned char *targetBytes = Tcl_SetByteArrayLength(result, dataPtr->len);
for (int i = 0, j = dataPtr->len - 1; j >= 0; i++, j--) {
targetBytes[i] = (unsigned byte) dataPtr->s[j];
}
return result;
}
Естественно, вы захотите прочитать руководство по использованию Critcl , когда это будет работать, и если вы собираетесьчтобы вызвать ошибки (возвращая NULL
), не забудьте установить сообщение об ошибке в интерпретаторе.вы можете получить к нему доступ, используя Tcl_Interp* interp
в качестве первого псевдо-аргумента для команды, которую вы создаете с помощью critcl::cproc
(она задокументирована, но ее легко пропустить).