使用包含用户定义类型的数组时遇到了一些麻烦。 一个简单的代码如下:
struct MyType
a::Int64
b::Int64
end
MyArray = Array{MyType}(5)
MyArray[1].a = [1 2 3]
编译器显示错误消息 “UnderRefError:访问未定义的引用” 这是问题,因为MyType没有默认构造函数吗?
答案 0 :(得分:4)
实际上,如果你没有明确定义一个,那么Julia总会自动定义一个默认的内部构造函数。它相当于:
julia> struct MyType
a::Int64
b::Int64
MyType(a,b) = new(a,b)
end
请注意,通过运行MyArray = Array{MyType}(5)
,您只需构造一个5个元素的数组,其eltype
应为MyType
。朱莉娅仍然不知道这些条目到底是什么,这就是错误所抱怨的。
看一下下面的例子:
julia> a = Array{Complex}(5)
5-element Array{Complex{T<:Real},1}:
#undef
#undef
#undef
#undef
#undef
顺便说一句,我不知道您对此行MyArray[1].a = [1 2 3]
的意思是什么,因为a
的类型为Int
,而不是Vector{Int}
。
答案 1 :(得分:3)
这条线没有意义
MyArray[1].a = [1 2 3]
你必须写一些像
这样的东西MyArray[1] = MyType(4, 5)
因为MyArray
数组的第一个元素未定义。 MyArray[1].a
表示您正在尝试访问未定义对象的a
成员。那不会起作用。
如果你想创建一个MyType对象的初始化5元素数组,你可以做这样的事情。
fill(MyType(0, 0), 10)