Проблемы с пользовательским типом в массиве с помощью julia

julia

163 просмотра

2 ответа

11 Репутация автора

У меня есть некоторые проблемы с использованием массива, содержащего пользовательский тип. Простой код выглядит так:

struct MyType
 a::Int64
 b::Int64
end

MyArray = Array{MyType}(5)
MyArray[1].a = [1 2 3] 

Компилятор показывает сообщение об ошибке «UnderRefError: доступ к неопределенной ссылке» Является ли это проблемой из-за отсутствия конструктора по умолчанию для MyType?

Автор: Jeting Wu Источник Размещён: 18.07.2016 08:31

Ответы (2)


4 плюса

5453 Репутация автора

На самом деле, всегда есть внутренний конструктор по умолчанию, автоматически определяемый Джулией, если вы не определите его явно. Это эквивалентно:

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}.

Автор: Gnimuc Размещён: 18.07.2016 09:21

3 плюса

5535 Репутация автора

Эта строка не имеет смысла

MyArray[1].a = [1 2 3]

Вы должны написать что-то вроде

MyArray[1] = MyType(4, 5)

потому что первый элемент MyArrayмассива не определен. MyArray[1].aозначает, что вы пытаетесь получить доступ к aэлементу неопределенного объекта. Это не сработает.

Если вы хотите создать инициализированный 5-элементный массив объектов MyType, вы можете сделать что-то вроде этого.

fill(MyType(0, 0), 10)
Автор: Erik Engheim Размещён: 27.02.2017 08:55
Вопросы из категории :
32x32