如何解决如何创建Swift类型UnsafePointer <UnsafePointer <Int8>的实例?传递给C函数
C函数的参数之一定义为类型:
const char * const * i_argv
_ i_argv: UnsafePointer<UnsafePointer<Int8>?>!
我创建此类实例的所有尝试都失败了
我想传递两个Int8的数组
let args: [Int8] = [ 1,1 ]
如果我直接通过此操作,则会收到错误消息:
cannot convert value of type 'UnsafePointer<Int8>' to expected argument type 'UnsafePointer<UnsafePointer<Int8>?>'
所以我然后尝试将数组包装在外部UnsafePointer中
let argsp: UnsafePointer<Optional<UnsafePointer<Int8>>> = UnsafePointer(args)
cannot assign value of type 'UnsafePointer<Int8>' to type 'UnsafePointer<Optional<UnsafePointer<Int8>>>'
我不知道如何用外部UnsafePointer包装数组的UnsafePointer类型
编辑:
来自C项目的示例:
#define FIB_ARG_VALUE "40"
const char* i_argv[2] = { FIB_ARG_VALUE,NULL };
result = m3_CallWithArgs (f,1,i_argv);
在您发表评论之后,我设法使用以下参数构造(只是一个编译测试)来编译Swift代码
let argsp: [UnsafePointer<Int8>?] = [ UnsafePointer([1,2,3]),UnsafePointer("40".cString(using: String.Encoding.utf8)) ]
这仍然会发出有关创建悬空指针的警告
解决方法
正如我在评论中写道,
当参数类型为
UnsafePointer<UnsafePointer<Int8>?>!
时,您需要传递UnsafePointer<Int8>?
的数组。
在重新更新的部分中,您了解了部分传递UnsafePointer<Int8>?
数组,但是您未能创建数组的每个元素。
与您的C项目中的示例等效的Swift是:
let FIB_ARG_VALUE = "40"
let result: CInt = FIB_ARG_VALUE.withCString {pointer in
let i_argv: [UnsafePointer<Int8>?] = [
pointer,nil
]
return m3_CallWithArgs(f,1,i_argv)
}
编译测试代码的正确方法应如下所示:
let arg1: [Int8] = [1,2,3]
let arg2: String = "40"
_ = arg1.withUnsafeBufferPointer {arg1BufPtr in
arg2.withCString {arg2Ptr in
let argsp: [UnsafePointer<Int8>?] = [ arg1BufPtr.baseAddress,arg2Ptr
]
//Use `argsp` inside this block.
//...
}
}
在两种情况下,我都假定您的C函数不会保留在i_argv
中传递的指针供以后使用,否则您需要进行一些修改才能将内容复制到某个稳定的地址。
或者您可能需要根据实际参数或C函数的功能来修改其他一些部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。