使用 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