在 Julia 中使用结构数组

Working with an array of structs in Julia

当我无法在其中存储数据时,我在 Julia 中定义了一个可变结构。我的结构如下:

mutable struct MPData{T}
    MPType::Char
    ConstModelType::Char
    MPCoords::Array{T}
    MPVol::T
    MPInitVol::T
    MPMass::T
    MPNodes::Array{UInt32}
    MPEls::Array{UInt32}
    NumStiffMatEntries::UInt32
    BasisFns::Array{T}
    BasisFnsDerivs::Array{T}
    PrevDefGrad::Array{T}
    CurrentDefGrad::Array{T}
    CauchyStress::Vector{T}
    PrevElasticStrain::Vector{T}
    CurrentElasticStrain::Vector{T}
    MatConsts::MatParams
    PointForces::Array{T}
    Displacement::Array{T}
end

结构数组的初始化如下: MPDataArray = Array{MPData{Float32},1}(undef, TotalNumMP) 其中TotalNumMP是数组的长度。但是,当我尝试用数据实际填充结构时,我收到错误 LoadError: UndefRefError: access to undefined reference。填充结构的代码是:

for MPNum in 1:TotalNumMP
     MPDataArray[MPNum].MPType = 'M'
end

我做错了什么?

您使用 MPData{T} 结构作为其元素类型创建了一个 Array 并为 TotalNumMP 元素分配了内存,但没有创建该结构的实际实例。这称为 未初始化 数组,由 undef.

指示

如果结构是不可变的并且不使用指针 (isbitstype),您仍然可以索引数组,但所有值都是随机垃圾。

但是,您有一个必须使用指针的可变结构,因此它不是 isbits 类型。在那种情况下,Julia 不允许您访问该元素,就好像那里有一个实例一样(MPDataArray[MPNum]),因为否则您将有一个悬空指针,这是非常危险的东西,他们甚至不会让您拥有它随机垃圾。唯一允许你对未初始化的元素做的事情是分配一个合适的实例:

MPDataArray[MPNum] = MPData(...)

您似乎想用实际实例创建一个数组,然后修改实例。在那种情况下,您应该定义一种方法来制作虚拟值,例如:

Base.zero(::Type{MPData{T}}) where T = MPData(...)

然后你可以创建一个完全初始化的虚拟值数组:

zeros(MPData{T}, TotalNumMP)