Как получить строку из функции на Си?

Почему-то эту тему совсем не осветили в документации Crystal, упомянув только то, что передавать и получать строки (при взаимодействии с кодом на Си) можно только как указатели на UInt8. Ни одного примера на эту тему не нашёл, поэтому на всякий случай «восполню пробел»:

lib LibC
  fun ctermid : UInt8*
end
puts String.new(LibC.ctermid)

Функция ctermid возвращает указатель на строку, которая *char с точки зрения языка Си, и она же UInt8* (т.е. Pointer(UInt8)) в языке Crystal. После выполнения функции ctermid в jбласть памяти, адресуемую полученным из функции указателем UInt8*, будет записана последовательность байт, заканчивающаяся байтом со значением 0, что является обычным для Си способом представления строк. И хотя без проблем можно было бы получить результирующую строку, попросту пройдясь в цикле до того самого «нулевого» байта, даже от этой необходимости нас избавил рантайм языка: ведь в Crystal можно создать строку напрямую из UInt8*, что, собственно, и показано в примере выше!

Вот такой простой пример. Для домашней же проработки оставляю вам статью, в которой описаны куда более интересные трюки, допустимые при работе с внешними функциями на языке Си.

За сим до свидания — и до встречи в русскоязычной телеграмм-группе, посвящённой языку Crystal:
telegram.me/crystal_ru

0 комментариев