Генерация кода Matlab для классов обработки, перераспределенных в цикле

Я сталкиваюсь с некоторым поведением в Matlab Coder, которое я не совсем понимаю. Для упрощения, вот небольшой пример, демонстрирующий поведение. Если у меня есть класс ручки, определенный как:

classdef somehandleclass < handle %#codegen

properties
    something
end

methods
    function obj = somehandleclass(initval)
        obj.something = initval;
    end
end

end

и короткую функцию для его использования:

function result = runsomehandleclass %#codegen

obj = somehandleclass(0);
for i=1:6
    obj = somehandleclass(i);
end

result = obj.something;

end

... затем я создаю функцию runsomehandleclass с помощью простого скрипта сборки:

cfg = coder.config('mex');
cfg.GenerateReport = true;
codegen -config cfg runsomehandleclass

Я получаю следующую ошибку:

??? Неподдерживаемое размещение. Выделенный объект дескриптора выходит из цикла. Ошибка в ==> runomehandleclass Строка: 5 Столбец: 11

Я понимаю текст ошибки, очевидно, я создаю новые экземпляры somehandleclass каждый раз в цикле. Мой вопрос: почему это должно быть ошибкой? В этом простом примере это легко обойти, но проблема возникает в гораздо большей базе кода, где глубоко в другой функции реинстанцируется класс дескриптора с существенно другими настройками. Я могу (и пытался) обойти это, но новое решение гораздо менее элегантно. На самом деле утечки здесь нет, поскольку предполагается, что классы дескрипторов удаляются при перезаписи их дескрипторов.

Если я удалю наследование от handle и сделаю класс классом значений, ошибка исчезнет, ​​и mex будет компилироваться должным образом, однако в моем реальном приложении я действительно хочу иметь класс дескриптора.

Это ожидаемое поведение компилятора? Кроме того, есть ли обходной путь, например, есть ли способ явно удалить obj, прежде чем я создам новый экземпляр в obj?


person Tony    schedule 04.09.2015    source источник


Ответы (1)


См. здесь, это ваше дело.

В obj = somehandleclass(i);, obj, который был инициализирован вне цикла, ссылался на объект somehandleclass, созданный внутри цикла. Другими словами, используйте класс значений, если хотите использовать его внутри цикла.

person scmg    schedule 04.09.2015
comment
Это более или менее повторение моего вопроса. Да, я знаю, что он создается вне цикла, а затем (предположительно) уничтожается и воссоздается снова и снова в цикле. Это всего лишь простой пример проблемы; в моем реальном приложении создание экземпляра происходит глубоко в другом коде, но ошибка и результат такие же. Желательно, чтобы это был класс-дескриптор и вызывать конструктор заново в цикле. Насколько я могу судить, нет никаких причин, по которым этот код не должен быть действительным или компилироваться. Он работает в MATLAB напрямую. Это как-то запрещенный вариант использования? - person Tony; 04.09.2015
comment
... если это запрещенный вариант использования, можете ли вы указать на документ для MATLAB Coder, который указывает, что классы дескрипторов не могут быть инициализированы в цикле? - person Tony; 04.09.2015
comment
поскольку это Matlab, а не C ++. вы используете его возможности и должны жить с его ограничениями. говоря abt class и oop, Matlab никогда не был ни хорошим выбором, ни одним из основных. Вы видели ссылку? В нем очень четко сказано A Variable Outside a Loop Cannot Refer to a Handle Object Created Inside a Loop - person scmg; 04.09.2015
comment
Я не собирался делать повторение, я указал, где Matlab сказал, что ваш случай не принимается с генерацией кода. И это ответ на ваш вопрос об ожидаемом поведении компилятора. - person scmg; 04.09.2015
comment
Ага, спасибо, что добавили ссылку. Это именно то, что я искал. - person Tony; 04.09.2015
comment
... иначе ваша ссылка была там все время, и я ее пропустил. Мои извенения. - person Tony; 04.09.2015