Программа получила и не обработала сигнал IOT (6) при запуске программы Crystal - PullRequest
0 голосов
/ 27 августа 2018

У меня есть программа, связанная с библиотекой C "nats"

@[Link("nats")]
lib LibNats
  fun natsConnection_ConnectTo(connection: UInt64*, connstr: UInt8*)
  fun natsConnection_PublishString(connection: UInt64*, key: UInt8*, value: UInt8*)
  fun natsConnection_Subscribe(sub: UInt64*, connection: UInt64*, key: UInt8*, cb: (UInt64*, UInt64*, UInt64*) -> Void)
end

connection = uninitialized UInt64
s = uninitialized UInt64

LibNats.natsConnection_ConnectTo(pointerof(connection), "nats://localhost:4222")
LibNats.natsConnection_Subscribe(pointerof(s), pointerof(connection), "qwe", ->(c, s, m) {
  puts m
})
LibNats.natsConnection_PublishString(pointerof(connection), "qwe", "{}")

После запуска я получаю сообщение об ошибке: Program received and didn't handle signal IOT (6)

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Глядя на включаемый файл , первая функция:

NATS_EXTERN natsStatus
natsConnection_ConnectTo(natsConnection **nc, const char *urls);

Посмотрите на двойной указатель, тогда как в привязке вы просто используете один указатель.

Это очень распространено в библиотеках C: у вас есть некоторая структура с вашими данными (natsConnection), и вы обычно передаете ее по ссылке (отсюда указатель), но вы получаете указатель на этот указатель в функции "конструктор", где Вы хотите сохранить этот указатель, для которого память обычно выделяется самой функцией.

В любом случае, объяснение очень длинное, и сейчас у меня нет времени, но попробуйте это:

@[Link("nats")]
lib LibNats
  type Conn = Void*
  type Sub = Void*

  alias Status = Int32

  fun natsConnection_ConnectTo(connection : Conn*, connstr : UInt8*) : Status
  fun natsConnection_PublishString(connection : Conn, key : UInt8*, value : UInt8*) : Status
  fun natsConnection_Subscribe(sub : Sub*, connection : Conn, key : UInt8*, cb : (UInt64*, UInt64*, UInt64*) -> Void) : Status
end

status = LibNats.natsConnection_ConnectTo(out connection, "nats://localhost:4222")
abort "natsConnection_ConnectTo failed" if status != 0

status = LibNats.natsConnection_Subscribe(out subscription, connection, "qwe", ->(c, s, m) {
  puts m
})
abort "natsConnection_Subscribe failed" if status != 0

status = LibNats.natsConnection_PublishString(connection, "qwe", "{}")
abort "natsConnection_PublishString failed" if status != 0

Также ознакомьтесь с ключевым словом out и убедитесь, что вы проверяете наличие ошибок.

0 голосов
/ 27 августа 2018

Для решения проблемы я использую явные указатели Pointer(UInt64).new(...) вместо pointerof(...):

LibNats.natsConnection_ConnectTo(pointerof(connection), "nats://localhost:4222")
LibNats.natsConnection_Subscribe(pointerof(s), Pointer(UInt64).new(connection), "qwe", ->(c, s, m) {
  puts m
})
LibNats.natsConnection_PublishString(Pointer(UInt64).new(connection), "qwe", "{}")
...