作为Xcode的新手,我正在尝试使用使用指针的外部C调用,而我很难找到在Swift中引用它们的方法。 C中的原始调用定义为:
int32 FAR PASCAL swe_calc(double tjd, int ipl, int32 iflag, double *xx, char *serr)
其中xx
是指向6个双打数组的指针,serr
是指向任何错误消息的指针
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
行给出错误
无法将输入类型[(Double)]的值分配给'UnsafeMutablePointer'类型的值
我需要一种方法来获取/引用/使用从xx
返回的值到6个双精度数组中,serr
绝对不应该是Int8
,而是字符串代替。 (我可以让其他Java和C#版本工作,但是Swift让我感到难过。)
如何进行swe_calc
调用以满足其需要,并获得我需要的内容?
答案 0 :(得分:2)
你很亲密。两个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)