程序收到但未处理信号 IOT(6),运行时 Crystal 程序



我有程序,链接到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)

查看包含文件,第一个函数是:

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 关键字,并确保检查错误。

为了解决问题,我使用显式指针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", "{}")

相关内容

最新更新