You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:27:40