pointers - UnsafeMutablePointer<Int8> 来自 Swift 中的字符串

标签 pointers swift char lapack accelerate-framework

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

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

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

最佳答案

“问题”是前两个参数声明为 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, ...)
}

在 block 内,$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 中所述.

关于pointers - UnsafeMutablePointer<Int8> 来自 Swift 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27876179/

相关文章:

c - 从 C 中的 *char[] 变量获取第一个字符

64位的c++指针赋值

c - 空指针为什么我得到这个输出?

objective-c - 场景的 Sprite 套件快速边界

java - 具有 int 和 char 操作数的三元表达式的类型是什么?

java - 如何在java中将阿拉伯字符转换为十六进制字符串

c - K&R 的 atof 实现有什么问题?

c - 在 C 程序中使用 typedef 时出现问题

iphone - 模拟器和 iPhone 使用相同的代码发出不同的 Web 请求

ios - 如何解决目标 'BVLinearGrandient' 和 'FBReactNativeSpec' 之间依赖关系的循环问题?