Julia 如何围绕字符串数组C创建精简包装器

Julia 如何围绕字符串数组C创建精简包装器,julia,Julia,当使用Julia调用C时,Julia可以为C分配的现有数据提供一个瘦包装器,这使得C和Julia之间的数据交换非常有效。下面是Julia embedding部分中著名的在线示例: double *existingArray = (double*)malloc(sizeof(double)*10); jl_array_t *x = jl_ptr_to_array_1d(array_type, existingArray, 10, 0); 我的问题是:Julia gurus能否提供一个示例,说明如

当使用Julia调用C时,Julia可以为C分配的现有数据提供一个瘦包装器,这使得C和Julia之间的数据交换非常有效。下面是Julia embedding部分中著名的在线示例:

double *existingArray = (double*)malloc(sizeof(double)*10);
jl_array_t *x = jl_ptr_to_array_1d(array_type, existingArray, 10, 0);
我的问题是:Julia gurus能否提供一个示例,说明如何围绕现有字符串数组(已在C中的堆上分配)创建一个瘦包装器

接下来的一个问题是:我们是否也需要以某种方式处理写障碍?由于字符串数组基本上是指针数组

另一个问题是:当底层数据是字符串数组时,Julia如何处理:即指针数组,每个指针指向以null结尾的字符串的起始地址

非常感谢


致远

看来Julia 0.5.2并没有抱怨以下方法:

假设在C/C++中,您有:

char*pchar指向“A是s\0B是som\0C是som\0D是some\0”,size:34=size\u all

char**myStrArray有4个指针:指向“A”、“B”、“C”和“D”的位置

目标是在不复制的情况下将pchar和myStrArray传递回Julia,以便在Julia中以某种方式获得字符串数组:

{“A是s”,“B是so”,“C是som”,“D是some”}

在C/C++部分:

jl_value_t* array_type_pointer = jl_apply_array_type(jl_voidpointer_type, 1);
jl_array_t* str_array = jl_ptr_to_array_1d( array_type_pointer, (void*)myStrArray, 4, 1 );
jl_set_nth_field(ret, 14, (jl_value_t*)str_array );

jl_value_t* array_type_uint8 = jl_apply_array_type(jl_uint8_type, 1);
jl_array_t* chr_array = jl_ptr_to_array_1d( array_type_uint8, (uint8_t*)pchar, size_all, 1 );
jl_set_nth_field(ret, 13, (jl_value_t*)chr_array );
请注意,在jl_ptr_to_array_1d调用中,最后一个参数:=1,这意味着Julia拥有缓冲区

茱莉亚部分

您声明以下两项:

StrVec::Array
StrVecPtr::Array
比如说,上面两个都属于ret1

julia> String(copy( ret1.StrVec ) )
"A is s\0B is so\0C is som\0D is some\0"

julia> ret1.StrVecPtr
4-element Array{Ptr{Void},1}:
 Ptr{Void} @0x000000000404aa00
 Ptr{Void} @0x000000000404aa07
 Ptr{Void} @0x000000000404aa0f
 Ptr{Void} @0x000000000404aa18

julia> unsafe_string( convert( Ptr{UInt8}, ret1.StrVecPtr[1] ) )
"A is s"

julia> unsafe_string( convert( Ptr{UInt8}, ret1.StrVecPtr[2] ) )
"B is so"

julia> unsafe_string( convert( Ptr{UInt8}, ret1.StrVecPtr[3] ) )
"C is som"

julia> unsafe_string( convert( Ptr{UInt8}, ret1.StrVecPtr[4] ) )
"D is some"
备注:内容包含在UInt8数组中,由“\0”分隔,在内存中是连续的,这样做毕竟更容易进行gc

如果有人发现了一些错误,或者有其他方法,请发布


非常感谢。

您是否在寻找不安全的\u wrap和不安全的\u string?您可以使用GC。@preserve来防止C字符串数组被GC-ed。感谢您指出这一点。我不确定我是否完全理解了您的问题,但我想我最近对一个不相关问题的回答可能也与此相关