我正在尝试将字符串参数从 swift 函数包装器传递给采用 char* 的 C 函数。
这个交流功能
long swe_fixstar2_ut(char* star, double tjd_ut, long iflag, double* xx, char* serr);
参数 star 必须为返回的星星名称提供至少 41 个字符。如果找到一颗星,则返回其名称。此函数从 txt 文件中搜索星星名称。
当导入 Swift 函数时看起来像这样
swe_fixstar_ut(star: UnsafeMutablePointer<Int8>!, tjd_ut: Double, iflag: int32,
xx: UnsafeMutablePointer<Double>!, serr: UnsafeMutablePointer<Int8>!)
我想实现这样的目标
public func sweFixStarsUT(star: String, tjdUT: Double, iFlag: Int32) {
let xx: UnsafeMutablePointer = UnsafeMutablePointer<Double>.allocate(capacity:6)
let serr:UnsafeMutablePointer = UnsafeMutablePointer<CChar>.allocate(capacity:256)
swe_fixstar_ut(star, tjdUT, iFlag, xx, serr)
}
我环顾了几个类似的问题,但它并没有解决我的问题。
如何将 Swift 字符串数组传递给采用 char ** 参数的 C 函数
实际上这个函数来自瑞士星历C库。这是链接,如果你们有兴趣看
就我阅读的文档而言,该参数star
用于输入和输出,因此您star
的 Swift 函数应该是inout
.
并且long
被导入为Int
,在苹果的64位平台中,它代表64位有符号整数类型,如果它真的是32位,你可能需要更新你的C代码的源文件。我认为它是Int
.
所以,我会像这样编写桥接代码:
public func sweFixStarsUT(star: inout String, tjdUT: Double, iFlag: Int) {
let starLen = max(star.utf8.count, 41)
var starBuf: [CChar] = Array(repeating: 0, count: starLen+1)
strcpy(&starBuf, star)
var xx: [Double] = Array(repeating: 0.0, count: 6)
var serr: [CChar] = Array(repeating: 0, count: 256)
swe_fixstar2_ut(&starBuf, tjdUT, iFlag, &xx, &serr)
star = String(cString: starBuf)
}
我更喜欢在将指针传递给 C 函数时使用数组,因为函数不保留指针供以后使用。使用数组,您无需担心取消分配。
您可以看到代码如何将输入转换star
为 CChar 数组并将数组转换回字符串。
如果您发现此代码有问题,请告诉我。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句