Matlab `openvar` принимает transpose & mdash; ИНОГДА (?!?)

A StackOverflowError - ошибка времени выполнения в java.

Он вызывается, когда количество памяти стека вызовов распределено JVM.

Обычный случай, когда a StackOverflowError выбрасывается, когда стек вызовов превышает из-за чрезмерной глубокой или бесконечной рекурсии.

Пример:

public class Factorial {
    public static int factorial(int n){
        if(n == 1){
            return 1;
        }
        else{
            return n * factorial(n-1);
        }
    }

    public static void main(String[] args){
        System.out.println("Main method started");
        int result = Factorial.factorial(-1);
        System.out.println("Factorial ==>"+result);
        System.out.println("Main method ended");
    }
}

Трассировка стека:

Main method started
Exception in thread "main" java.lang.StackOverflowError
at com.program.stackoverflow.Factorial.factorial(Factorial.java:9)
at com.program.stackoverflow.Factorial.factorial(Factorial.java:9)
at com.program.stackoverflow.Factorial.factorial(Factorial.java:9)

В приведенном выше случае можно избежать программных изменений. Но если логика программы правильная, и все же это происходит, тогда размер стека должен быть увеличен.

1
задан user36800 13 July 2018 в 21:04
поделиться

1 ответ

Тактические причины принятия openvar('x.''') и отклонения openvar('x''') можно увидеть, используя dbstop if error. Выдача openvar('x''') затем показывает, что ошибка вызвана методом класса VariableEditor, checkVariableName. Он проверяет строковый аргумент openvar, глядя слева от любой точки или скобки / скобки. Для аргумента x.' это x - код принимает это как хорошее имя переменной. В отсутствие точки или скобки он проверяет все выражение, которое является x' и которое код не распознает как хорошее имя переменной.

Пока это показывает, как код порождает поведение, описанное в исходном сообщении, рассуждения более высокого уровня не очевидны - особенно если openvar может оценить и представить транспонирование, как показывает исходное сообщение. Возможно, TMW ограничил аргумент именами переменных только потому, что было бы слишком сложно поддерживать все выражения. И, возможно, они просто не потрудились замаскировать все возможные выражения без переменных. Крис Луенго отметил, что openvar('cos(pi)') проходит тест, но окно редактора переменных открывается и говорит: «Переменная cos (pi) не существует».

В любом случае, зная, как транслировать данные для отображения, очень полезно, потому что есть много случаев, когда (i) я хочу / иметь вектор строки, но (ii) я хочу просмотреть его как столбец .

Причина пункта (i) представляется исторической и практической. Выдача clear x; x(3)=7 по умолчанию в массив row , т. Е. Распространяется по размеру second , а не по сравнению с первым измерением (вниз). Это практично, потому что он позволяет командному окну отображать много информации без слишком большой прокрутки, тем самым сохраняя большую часть предыдущей информации для просмотра (это возвращается к временам перед Редактором переменных). Кроме того, векторы должны быть горизонтальными для элементов, подлежащих повторению в идиоме for myIterator = VectorOfItems, что делает его ориентировочным.

Причина для пункта (ii) снова является практической. Распространение чего-то горизонтально в Редакторе переменных затрудняет просмотр, поскольку горизонтальное расстояние по умолчанию слишком велико. Вы не видите многого для ширины avaialable, и когнитивно трудно понять массив данных, когда он слишком разнесен. Просмотр таких данных, как векторы столбцов, имеет больше смысла, и исторические соображения, стоящие за элементом (i), не применяются, поскольку это не относится к контекстному окну командной строки. Кроме того, в редакторе переменных мы можем горизонтально подкрасить окна для разных вызовов openvar, поэтому отображение данных столбца не будет тратить пространство, как это было бы в окне командной строки прокрутки.

Кроме этого: осуществление слежки в коде openvar показало странности в задании функций для dbstop. Например, если вы укажете полный путь к checkVariableName из сообщения об ошибке, точка останова не будет установлена. Вы должны выдать dbstop if error, а затем отправить неприемлемый аргумент в openvar, чтобы вызвать ошибку, которая открывает код checkVariableName в редакторе. Только тогда вы можете установить контрольную точку в checkVariableName с помощью редактора графического интерфейса или перейти на один уровень в стеке и установить точку останова, где openvar вызывается.

1
ответ дан user36800 17 August 2018 в 12:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: