开发者问题收集

使用 Swift 引用使用指针的外部 C 函数调用

2015-05-04
308

作为 Xcode 新手,我正在尝试使用使用指针的外部 C 调用,但很难找到在 Swift 中引用它们的方法。原始的 C 语言调用定义如下:

int32 FAR PASCAL swe_calc(double tjd, int ipl, int32 iflag, double *xx, char *serr)

其中 xx 是指向 6 个 Double 数组的指针,而 serr 是指向任何错误消息的指针

Swift 将其视为:

int32 swe_calc(tjd: Double, ipl: Int32, iflag: int32, xx: UnsafeMutablePointer<Double>, serr: UnsafeMutablePointer<Int8>)

(来自: https://github.com/dwlnetnl/SwissEphemeris/tree/master/SwissEphemeris

我尝试过的最接近的方法是:

var serr : UnsafeMutablePointer<Int8> = nil; // returns any error messages from the call
var x  = [Double](count: 6, repeatedValue: 0); // array of 6 doubles returned from the call
var xx : UnsafeMutablePointer<Double> ;

xx = &x
swe_calc(2436647.0003794227, 4, 258, xx, serr)
println("xx = \(x[0]), \(x[1]), \(x[2]), \(x[3]), \(x[4]), \(x[5]), errors (if any)=\(serr)")

xx=&x 给出错误

Cannot assign a value of type input[(Double)] to a value of type ‘UnsafeMutablePointer’

我需要一种方法来获取/引用/使用 xx 返回的值并将其放入 6 个双精度数组中,并且 serr 绝对不应该是 Int8 ,而应该是一个字符串。(我可以让其他 Java 和 C# 版本工作,但 Swift 让我不知所措。)

我如何才能使 swe_calc 调用为其提供所需的信息并获取我需要的信息?

1个回答

您已经接近了。两个 UnsafeMutablePointer 参数都需要一个适当类型的数组,作为“inout 参数”通过 & 传递:

var x  = [Double](count: 6, repeatedValue: 0);
var serr = [Int8](count: 1024, repeatedValue: 0)
let result = swe_calc(2436647.0003794227, 4, 258, &x, &serr)

当然,数组必须分配得足够大,以满足 C 函数的预期。

如果该函数将 NUL 终止的错误字符串放入 serr 指向的缓冲区,那么您可以使用以下命令将其转换为 Swift 字符串:

let errorString = String.fromCString(&serr)
Martin R
2015-05-04