Читаем Crystal Programming. Введение на основе проекта в создание эффективных, безопасных и читаемых веб-приложений и приложений CLI полностью

void print_tz(struct TimeZone *tz)

{

  printf("DST time is: %d\n", tz->dst_time);

}

Здесь мы определяем структуру C под названием TimeZone, которая имеет два свойства int. Затем мы определяем функцию, которая будет печатать свойство времени летнего времени указателя на эту структуру. Соответствующая привязка Crystal будет выглядеть следующим образом:

@[Link(ldflags: "#{__DIR__}/struct.o")]

lib LibStruct

  struct TimeZone

    minutes_west : Int32

    dst time : Int32

  end

  fun print_tz(tz : TimeZone*) : Void

end

tz = LibStruct::TimeZone.new

tz.minutes_west = 1

tz.dst_time = 14

LibStruct.print_tz pointerof(tz)

Определение этой структуры позволяет создать ее экземпляр, как и любой другой объект, через .new. Однако, в отличие от предыдущего примера, мы не можем передать объект непосредственно в функцию C. Это связано с тем, что структура определена в пространстве имен lib, ожидает указатель на нее и не имеет метода #to_unsafe. В следующем разделе будет рассказано, как лучше всего с этим справиться.

Компиляция объектного файла и запуск программы Crystal, как и раньше, выведет: Время летнего времени: 14.

Еще одна распространенная функция привязки C — поддержка обратных вызовов. Crystal, эквивалентный указателю на функцию C, — это Proc. Лучше всего это показать на примере. Давайте напишем функцию C, которая принимает обратный вызов, принимающий целочисленное значение. Функция C сгенерирует случайное число, а затем вызовет обратный вызов с этим значением. В конечном итоге это может выглядеть примерно так:

#include

#include

void number_callback(void (*callback)(int))

{

  srand(time(0));

  return (*callback)(rand());

}

Привязки Crystal будут выглядеть так:

@[Link(ldflags: "#{__DIR__}/callback.o")]

lib LibCallback

  fun number_callback(callback : LibC::Int -> Void) : Void

  end

LibCallback.number_callback ->(value) { puts "Generated: #{value}" }

В этом примере мы передаем Proc(LibC::Int, Nil) в качестве значения аргумента обратного вызова C. Обычно вам нужно будет ввести значение аргумента Proc. Однако, поскольку мы передаем Proc напрямую, компилятор может определить его на основе типа привязанного развлечения и ввести его за нас. Тип обязателен, если мы сначала присвоили его переменной, например callback = ->(value : LibC::Int) { ... }.

Обратный вызов напечатает, какое случайное значение сгенерировал код C. Помните: прежде чем мы сможем запустить код Crystal, нам нужно скомпилировать код C в объектный файл с помощью этой команды: gcc -Wall -O3 -march=native -c callback.c -o callback.o. После этого вы можете свободно запускать код Crystal несколько раз и утверждать, что он каждый раз генерирует новое число.

Хотя мы можем передавать Procs как функцию обратного вызова, вы не можете передать замыкание, например, если вы попытались сослаться на переменную, определенную вне Proc внутри него. Например, если мы хотим умножить сгенерированное значение C на некоторый множитель:

multiplier = 5

LibCallback.number_callback ->(value : LibC::Int) { puts

value * multiplier }

Выполнение этого приведет к ошибке времени компиляции: Ошибка: невозможно отправить замыкание в функцию C (замыкающие переменные: множитель).

Передача замыкания возможна, но это немного сложнее. Я бы предложил проверить этот пример в документации Crystal API: https://crystal-lang.org/api/Proc.html#passing-a-proc-to-a-c-function. Как упоминалось ранее, привязки C могут быть отличным способом использования уже существующего кода C. Теперь, когда вы знаете, как подключаться к библиотеке, писать привязки и использовать их в Crystal, вы можете фактически использовать код библиотеки C. Далее перейдем к написанию привязок для libnotify.

<p>Привязка libnotify</p>

Одним из преимуществ написания привязок C в Crystal является то, что вам нужно привязывать только то, что вам нужно. Другими словами, нам не нужно полностью привязывать libnotify, если мы собираемся использовать лишь небольшую его часть. На самом деле нам нужны всего четыре функции:

• notify_init – используется для инициализации libnotify.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных