如何在Julia构造函数中正确声明与使用SharedArray?
咱们一步步拆解你代码里的问题,然后给出可行的修正方案:
错误的核心原因
- 变量顺序颠倒:你在创建
f_valueN和f_policy时,n和m还没赋值,这会先触发未定义变量的错误,后续构造函数调用自然也会出问题。 - 构造函数参数不匹配:你的
DDFC结构体默认构造函数只需要4个参数(n::Int64, m::Int64, f_valueN::SharedArray{Float64,2}, f_policy::SharedArray{Float64,2}),但你调用时传了6个参数(α, β,f_valueN, f_policy, n, m),Julia找不到匹配的方法,所以抛出了MethodError。另外看起来你定义的α和β目前没用到,应该是打算后续用来初始化数组?
修正后的代码
首先确保你已经启动了多进程(如果需要跨进程共享数组的话),然后调整构造函数的逻辑:
using Distributed addprocs(2) # 根据需求添加进程数 @everywhere using SharedArrays @everywhere mutable struct DDFC{T <: Real} n::Int64 m::Int64 f_valueN::SharedArray{Float64,2} f_policy::SharedArray{Float64,2} end # 修正的关键字构造函数 @everywhere function DDFC(;n=2, m=3, α=0.3, β=0.5) # 先确定n和m的值,再创建SharedArray f_valueN = SharedArray{Float64,2}(n, m) f_policy = SharedArray{Float64,2}(n, m) # 如果你想用α和β初始化数组,可以添加这两步: # fill!(f_valueN, α) # fill!(f_policy, β) # 调用结构体的正确构造函数,注意参数顺序和类型匹配 DDFC{typeof(α)}(n, m, f_valueN, f_policy) end
测试调用
现在运行:
ddfc = DDFC()
就能正常创建DDFC实例了。你也可以自定义参数,比如:
ddfc_custom = DDFC(n=5, m=4, α=0.7)
额外说明
@everywhere宏确保结构体和函数定义在所有进程中都可用,这是使用SharedArray的必要前提。- 如果你的
α和β是用来做其他计算(而非初始化数组),可以在构造函数里添加对应的逻辑后再创建数组。 - 如果你不需要参数化类型
T,可以简化结构体定义为mutable struct DDFC,这样构造函数里直接调用DDFC(n, m, f_valueN, f_policy)即可。
内容的提问来源于stack exchange,提问作者Fazeleh
相关产品推荐
相关产品推荐

