Как определить, где число печатает от в MATLAB?

  1. Установите следующий плагин Избранные галереи

  2. Теперь отредактируйте файл controller.php

  3. [ 1111] Этот файл находится по адресу

    Your-wordpress-installation / wp-content / plugins / featured-galleries / includes

  4. Замените следующий код

    [ 1114] apply_filters ('fg_post_types', ['post', 'page']);

  5. с

    apply_filters ('fg_post_types', ['post', ' page ',' your_post_type ']);

  6. Если у вас слишком много типов постов

    apply_filters (' fg_post_types ', [' post ',' page ',' your_post_type_1 ',' your_post_type_2 ',' your_post_type_2 ']);

  7. Примечание. Замените your_post_type на ваш post_type

9
задан gnovice 7 November 2009 в 01:02
поделиться

7 ответов

Ох, я тоже это ненавижу. Я бы хотел, чтобы у Matlab был «dbstop if display», чтобы останавливаться именно на этом.

Хорошая идея - обойти минт от weiyin. Однако Mlint не видит динамический код, такой как аргументы функции eval () или функции обратного вызова для обработки строковых фигур. Я прибегал к такому выводу в обратных вызовах, подобных этому, где update_table () возвращает что-то в некоторых условиях.

uicontrol('Style','pushbutton', 'Callback','update_table')

Вы можете «утилизировать» метод во встроенных типах, чтобы получить ловушку для dbstop. В каталоге на вашем пути к Matlab создайте новый каталог с именем «@double» и создайте файл @ double / display.m, подобный этому.

function display(varargin)
builtin('display', varargin{:});

Затем вы можете сделать

dbstop in double/display at 2

и запустить свой код. Теперь вы попадете в отладчик всякий раз, когда display неявно вызывается с помощью пропущенной точки с запятой, в том числе из динамического кода. Выполнение этого для @double, похоже, также охватывает char и ячейки. Если отображается другой тип, возможно, вам придется поэкспериментировать.

Вероятно, вы могли бы таким же образом переопределить встроенную функцию disp (). Я думаю, что это было бы аналогично пользовательской замене потока Java System.out.

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

7
ответ дан 4 December 2019 в 09:38
поделиться

Если у вас есть такая строка, как:

foo = 2

, и нет ";" в конце вывод будет выведен на экран, и имя переменной появится первым:

foo =

     2

В этом случае вы должны найти в файле строку «foo =» и найти строку, в которой отсутствует «;».

Если вы видите вывод без имени переменной, то вывод, вероятно, выгружается на экран с помощью функции DISP или FPRINTF . Поиск в файле по запросу «disp» или «fprintf» должен помочь вам найти, где отображаются данные.

Если вы видите вывод с именем переменной «ans», это тот случай, когда вычисление выполняется, а не помещается в переменную, и отсутствует ';' в конце строки, например:

size(foo)

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

поскольку (как вы выяснили) бывает трудно найти, где они были размещены в большом фрагменте кода. В этом случае самый простой способ найти проблемную строку - использовать MLINT , как предлагалось в других ответах.

поскольку (как вы выяснили) бывает трудно найти, где они были размещены в большом фрагменте кода. В этом случае самый простой способ найти проблемную строку - использовать MLINT , как предлагалось в других ответах.

3
ответ дан 4 December 2019 в 09:38
поделиться

Это типичный образец, который вам поможет найти mLint:

alt text

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

5
ответ дан 4 December 2019 в 09:38
поделиться

I like the idea of "dbstop if display", however this is not a dbstop option that i know of.

If all else fails, there is still hope. Mlint is a good idea, but if there are many thousands of lines and many functions, then you may never find the offender. Worse, if this code has been sloppily written, there will be zillions of mlint flags that appear. How will you narrow it down?

A solution is to display your way there. I would overload the display function. Only temporarily, but this will work. If the output is being dumped to the command line as

ans = 
      stuff

or as

foo = 
      stuff

Then it has been written out with display. If it is coming out as just

stuff

then disp is the culprit. Why does it matter? Overload the offender. Create a new directory in some directory that is on top of your MATLAB search path, called @double (assuming that the output is a double variable. If it is character, then you will need an @char directory.) Do NOT put the @double directory itself on the MATLAB search path, just put it in some directory that is on your path.

Inside this directory, put a new m-file called disp.m or display.m, depending upon your determination of what has done the command line output. The contents of the m-file will be a call to the function builtin, which will allow you to then call the builtin version of disp or display on the input.

Now, set a debugging point inside the new function. Every time output is generated to the screen, this function will be called. If there are multiple events, you may need to use the debugger to allow processing to proceed until the offender has been trapped. Eventually, this process will trap the offensive line. Remember, you are in the debugger! Use the debugger to determine which function called disp, and where. You can step out of disp or display, or just look at the contents of dbstack to see what has happened.

When all is done and the problem repaired, delete this extra directory, and the disp/display function you put in it.

3
ответ дан 4 December 2019 в 09:38
поделиться

Вам нужно будет просмотреть все ваши m-файлы (возможно, используя рекурсивную функцию или unix ('find -type f -iname * .m')). Вызов mlint для каждого файла:

r = mlint(filename);

r будет (возможно, пустой) структурой с полем сообщения. Найдите сообщение, которое начинается с «Завершить оператор точкой с запятой для подавления вывода».

0
ответ дан 4 December 2019 в 09:38
поделиться

Вы можете запустить mlint как функцию и интерпретировать результаты.

>> I = mlint('filename','-struct');
>> isErrorMessage = arrayfun(@(S)strcmp(S.message,...
      'Terminate statement with semicolon to suppress output (in functions).'),I);
>>I(isErrorMessage ).line

Это позволит найти отсутствующие точки с запятой только в этом единственном файле. Таким образом, это должно быть выполнено для списка файлов (функций), которые вызываются из некоторой основной функции.

Если вы хотите найти вызовы disp () или fprintf (), вам нужно будет прочитать текст файл и используйте регулярные выражения для поиска вызовов.

Примечание: если вы используете сценарий вместо функции, вам нужно будет изменить приведенное выше сообщение на следующее: «Завершить оператор точкой с запятой для подавления вывода (в сценариях)».

1
ответ дан 4 December 2019 в 09:38
поделиться

Перегрузка Эндрю Янке - очень полезный совет единственное, что я считаю, вместо использования dbstop лучше работает по той простой причине, что установка остановки в display.m приведет к приостановке выполнения при каждом вызове display.m, даже если ничего не написано.

Таким образом, остановка будет срабатывать только тогда, когда display вызывается для записи ненулевой строки, и вам не придется выполнять потенциально очень большое количество бесполезных вызовов display

function display(varargin)
builtin('display', varargin{:});
if isempty(varargin{1})==0
keyboard
end
1
ответ дан 4 December 2019 в 09:38
поделиться
Другие вопросы по тегам:

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