Pointers 非女性化指针<;Int8>;从斯威夫特的字符串
我在加速框架中使用LAPACK实现的Pointers 非女性化指针<;Int8>;从斯威夫特的字符串,pointers,swift,char,lapack,accelerate-framework,Pointers,Swift,Char,Lapack,Accelerate Framework,我在加速框架中使用LAPACK实现的dgeev算法来计算矩阵的特征向量和特征值。遗憾的是,苹果的文档中没有对LAPACK函数进行描述,只包含了一个链接 如果您查找它,您会发现dgeev中的前两个参数是表示是否计算特征向量的字符。在Swift中,它请求不可分配指针。当我简单地使用“N”时,我会得到一个错误。dgeev功能和错误在以下屏幕截图中描述 我应该怎么做才能解决这个问题呢?这很难看,但您可以使用: let unsafePointerOfN = ("N" as NSString).UTF8St
dgeev
算法来计算矩阵的特征向量和特征值。遗憾的是,苹果的文档中没有对LAPACK函数进行描述,只包含了一个链接
如果您查找它,您会发现dgeev
中的前两个参数是表示是否计算特征向量的字符。在Swift中,它请求不可分配指针
。当我简单地使用“N”
时,我会得到一个错误。dgeev
功能和错误在以下屏幕截图中描述
我应该怎么做才能解决这个问题呢?这很难看,但您可以使用:
let unsafePointerOfN = ("N" as NSString).UTF8String
var unsafeMutablePointerOfN: UnsafeMutablePointer<Int8> = UnsafeMutablePointer(unsafePointerOfN)
让unsafePointerOfN=(“N”作为NSString)。UTF8String
var unsafeMutablePointerOfN:UnsafeMutablePointer=UnsafeMutablePointer(unsafePointerOfN)
并使用unsafemeutablepointerofn
作为参数,而不是“N”。问题是前两个参数被声明为char*
而不是作为const char*
,即使函数未修改字符串:
int dgeev_(char *__jobvl, char *__jobvr, ...);
映射到Swift作为
func dgeev_(__jobvl: UnsafeMutablePointer<Int8>, __jobvr: UnsafeMutablePointer<Int8>, ...) -> Int32;
func dgeev_(__jobvl: UnsafePointer<Int8>, __jobvr: UnsafePointer<Int8>, ...) -> Int32;
在块内部,$0
是一个指针,指向以NUL结尾的字符数组
字符串的UTF-8表示形式
备注:dgeev_389;()
不修改前两个参数所指向的字符串,
所以它“应该”被宣布为
int dgeev_(const char *__jobvl, const char *__jobvr, ...);
将映射到Swift作为
func dgeev_(__jobvl: UnsafeMutablePointer<Int8>, __jobvr: UnsafeMutablePointer<Int8>, ...) -> Int32;
func dgeev_(__jobvl: UnsafePointer<Int8>, __jobvr: UnsafePointer<Int8>, ...) -> Int32;
因为Swift字符串会自动转换为UnsafePointer)
,
如中所述,使用Swift4.2和5,您可以使用类似的方法
let str = "string"
let unsafePointer = UnsafeMutablePointer<Int8>(mutating: (str as NSString).utf8String)
let str=“string”
让unsafePointer=UnsafeMutablePointer(变为:(str为NSString).utf8String)
您可以从unsafePointer
中获得结果,该解决方案至少存在一个理论问题:由返回的字符串。UTF8String
仅在NSString
对象存在时才保证有效,这可能会被立即销毁,因为在第一行之后没有引用它。这很可能不会发生在这里,因为这里的字符串是一个文本常量。