gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:50:25 25 4
gpt4 key购买 nike

作为 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 个 double 组中,并且 serr 绝对不应该是 Int8 ,而是一个字符串。 (我可以让其他 Java 和 C# 版本工作,但 Swift 让我难住了。)

我怎样才能让 swe_calc 调用给它所需的东西,并得到我需要的东西?

最佳答案

你很接近。 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)

关于swift - 使用 Swift 引用使用指针的外部 C 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30039620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com