繁体   English   中英

UnsafeMutablePointer <Int8> 来自Swift的String

[英]UnsafeMutablePointer<Int8> from String in Swift

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

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

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

这很难看,但你可以使用:

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

并使用unsafeMutablePointerOfN作为参数而不是“N”。

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

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

映射到Swift as

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 as

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

在这种情况下,你可以简单地称之为

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

因为Swift字符串会自动转换为UnsafePointer<Int8>) ,如String值为UnsafePointer <UInt8>函数参数行为中所述

使用Swift 4.25,您可以使用这种类似的方法

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

您可以从unsafePointer获取结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM