首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >晶体-Lang c绑定结构似乎不传递空值。

晶体-Lang c绑定结构似乎不传递空值。
EN

Stack Overflow用户
提问于 2015-08-26 22:12:23
回答 1查看 350关注 0票数 2

目前,我正在尝试使用与c14n绑定的c-绑定来添加对crystal的c14n支持。我已经成功地使用xmlC14NDocSave将规范的xml保存到文件中。我遇到的问题是使用xmlOutputBufferPtr实现xmlC14NDocSaveTo和xmlC14NExecute。

我收到的错误是(Mac和Linux)

xmlC14NExecute:输出缓冲区编码器!= NULL但C14N需要UTF8输出

文件说明

此缓冲区必须具有encoder==NULL,因为C14N需要UTF-8输出。

src/C14N/lib_C14N.cr中,我有以下代码

代码语言:javascript
复制
type CharEncodingHandler = Void*
type Buff = Void*
#type OutputBuffer = Void*
struct OutputBuffer
  context : Void*
  writecallback : OutputWriteCallback
  closecallback : OutputCloseCallback
  encoder : CharEncodingHandler
  buffer  : Buff
  conv    : Buff
  written : Int32
  error   : Int32
end
....
fun xmlC14NDocSaveTo(doc : LibXML::Node*, nodes : LibXML::NodeSet*, mode : Mode, inclusive_ns_prefixes : UInt8**, with_comments : Int32, buf : OutputBuffer*) : Int32
fun xmlC14NExecute(doc : LibXML::Node*, is_visible_callback : IsVisibleCallback, user_data : Void*, mode : Mode, inclusive_ns_prefixes : UInt8**, with_comments : Int32, buf : OutputBuffer*) : Int32

src/C14N.cr

代码语言:javascript
复制
output = XML::LibC14N::OutputBuffer.new
p output.encoder
XML::LibC14N.xmlC14NDocSaveTo(@xml, nil, @mode, nil, 0, out output)

P ouput.encoder的结果是Pointer(Void).null,因此它的值似乎为null。

c14n.c函数只是在buf->编码器结构上检查null

代码语言:javascript
复制
if (buf->encoder != NULL) {
    xmlGenericError(xmlGenericErrorContext,
                    "xmlC14NExecute: output buffer encoder != NULL but C14N requires UTF8 output\n");
    return (-1);
}

任何帮助都将不胜感激,代码可以在我的github帐户上找到。克隆和运行crystal spec

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-27 00:01:12

不要指定out output,它只保留堆栈上结构大小的一个内存块,并传递一个指向它的指针。它没有将其归零,所以您传递垃圾。

使用output = XML::LibC14N::OutputBuffer.new已经是正确的第一步,因为这会使内存为零。现在要传递它,只需将out output替换为pointerof(output)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32237551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档