来自Swift </int8>中String的UnsafeMutablePointer <int8>

时间:2015-01-10 12:21:48

标签: pointers swift char lapack accelerate-framework

我使用Accelerate框架中LAPACK实现的dgeev算法来计算矩阵的特征向量和特征值。遗憾的是,Apple文档中没有描述LAPACK功能,仅包含http://netlib.org/lapack/faq.html的链接。

如果你查一下,你会发现dgeev中的前两个参数是表示是否计算特征向量的字符。在Swift中,它要求UnsafeMutablePointer<Int8>。当我只使用"N"时,我收到错误。以下屏幕截图enter image description here

中描述了dgeev函数和错误

我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:3)

很难看,但你可以使用:

let unsafePointerOfN = ("N" as NSString).UTF8String
var unsafeMutablePointerOfN: UnsafeMutablePointer<Int8> = UnsafeMutablePointer(unsafePointerOfN)

并使用unsafeMutablePointerOfN作为参数,而不是&#34; N&#34;。

答案 1 :(得分:3)

“问题”是前两个参数被声明为char * 而不是const char *,即使字符串未被函数修改:

int dgeev_(char *__jobvl, char *__jobvr, ...);

映射到Swift为

func dgeev_(__jobvl: UnsafeMutablePointer<Int8>, __jobvr: UnsafeMutablePointer<Int8>, ...) -> Int32;

可能的解决方法是

let result = "N".withCString { 
    dgeev_(UnsafeMutablePointer($0), UnsafeMutablePointer($0), &N, ...)
}

在块中,$0是指向NUL终止的char数组的指针, UTF-8表示字符串。


备注: dgeev_()不会修改前两个参数指向的字符串, 所以它“应该”声明为

int dgeev_(const char *__jobvl, const char *__jobvr, ...);

将作为

映射到Swift
func dgeev_(__jobvl: UnsafePointer<Int8>, __jobvr: UnsafePointer<Int8>, ...) -> Int32;

在这种情况下,您可以简单地将其称为

let result = dgeev_("N", "N", &N, ...)

因为Swift字符串会自动转换为UnsafePointer<Int8>), 正如String value to UnsafePointer<UInt8> function parameter behavior中所述。

答案 2 :(得分:0)

使用Swift 4.2 5 ,您可以使用类似的方法

let str = "string"
let unsafePointer = UnsafeMutablePointer<Int8>(mutating: (str as NSString).utf8String)

您可以从unsafePointer获得结果。