在 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)
当我无法在其中存储数据时,我在 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)