Swift调用Accelerate框架vvlog函数时的inout参数传参错误咨询
解决Accelerate框架vvlog函数传参报错问题
你用Accelerate框架的vvlog函数编写了计算以n为底X的对数的logNX函数,代码如下:
func logNX(_ n: Double, _ X: [Double]) -> [Double] { // Calculate the log base n of X. var Y = [Double](repeating: 0, count: X.count) vvlog(&Y, X, &Int32(X.count)) var N = [Double](repeating: n, count: X.count) var Z = [Double](repeating: 0, count: X.count) vvlog(&Z, N, &Int32(X.count)) return vDSP.divide(Y, N) }
但遇到了报错:
Cannot pass immutable value as inout argument: function call returns immutable value
错误原因
报错的根源在&Int32(X.count)这部分。Int32(X.count)是一个临时生成的不可变值,而vvlog的第三个参数要求传入UnsafeMutablePointer<Int32>类型的可变指针,直接取临时值的地址违反了Swift的内存安全规则,因此编译器报错。
解决方法
完全不需要用UnsafeMutableBuffer这种复杂方式,只要提前把数组长度转成可变的Int32变量即可,修改后的代码如下:
func logNX(_ n: Double, _ X: [Double]) -> [Double] { // Calculate the log base n of X. let count = Int32(X.count) var Y = [Double](repeating: 0, count: X.count) vvlog(&Y, X, &count) var N = [Double](repeating: n, count: X.count) var Z = [Double](repeating: 0, count: X.count) vvlog(&Z, N, &count) return vDSP.divide(Y, Z) }
另外注意你原代码最后返回的是vDSP.divide(Y, N),这里逻辑有误,应该除以存储n的对数结果的数组Z,已帮你修正。
内容的提问来源于stack exchange,提问作者triple7
相关产品推荐
相关产品推荐

