Операторы Trace и Debug

Давайте рассмотрим ваш алгоритм для ввода {1,2,3}:

  • Сначала вы добавляете 1 в tmp
  • Затем вы вызываете getPerm (2, [2, 3], [1], [])
  • Затем вы добавляете 2 к tmp
  • Затем вы вызываете geterm (1, [3], [1, 2], []) [116 ]
  • Затем вы добавляете 3 в tmp
  • Затем вы вызываете getPerm (0, [], [1, 2, 3], [])
  • Теперь вы добавляете первую перестановку [ 1, 2, 3] к результату и clear tmp
  • Поэтому следующей перестановке, которая должна быть [1, 3, 2], будет не хватать 1
[1112 ] Это можно исправить, если вместо очистки tmp каждый раз, когда вы добавляете к результату перестановку, вы удаляете только последний элемент, добавленный в tmp после рекурсивного вызова:

private void getPerm(int n, int[] a, ArrayList<Integer> tmp, ArrayList<List<Integer>> result)
{
    if(n == 0){
        ArrayList<Integer> toAdd = new ArrayList<Integer>(tmp);
        result.add(toAdd);
        // don't clear tmp here
        return;
    }
    for(int i = 0; i < n; i++){
        tmp.add(a[i]);
        int[] b = new int[n-1];
        int k = 0;
        int j = 0;
        while(k<b.length){
            if(a[i]==a[j]){j++;}
            else{b[k]=a[j]; k++; j++;}
        }

        getPerm(n-1, b, tmp, result);
        tmp.remove(tmp.size()-1); // remove the last element added to tmp
    }
}

Теперь вывод:

[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
8
задан MatthewMartin 6 May 2014 в 17:47
поделиться

4 ответа

На самом простом уровне у них есть различные переключатели компиляции - т.е. Debug.WriteLine и т.д. только переключается, если Вы имеете DEBUG символ компиляции (не характерный для сборок конечных версий), тогда как Trace.WriteLine будет обычно включаться даже в сборках конечных версий.

Trace маршрут имеет настраиваемые приемники трассировки, которые могут быть установлены вертикально на пути конфигурация; Debug обычно переходит к отладчику как слушатель. Конечно, существуют сторонние системы трассировки, которые предлагают намного больше гибкости.

7
ответ дан 5 December 2019 в 13:02
поделиться

Можно включить и выключить обоих независимо с переключателем компилятора, если Вы переходите к странице сборки своих свойств проекта, у Вас есть некоторые флажки там.

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

2
ответ дан 5 December 2019 в 13:02
поделиться

Я был склонен использовать Трассировку (со связанным TraceSwitch) для входа усилий в средах выпуска - быстрая тонкая настройка app.config может затем дать разные уровни входа без потребности в перекомпиляции (который мог бы заставить проблему уйти так или иначе), или потребность присоединить отладчик. Особенно удобный для проблем, которые только происходят на машинах клиента по любой причине - я использовал это для успешного дампа выходить из класса FTP (назад в старой Платформе 1,1 дня), чтобы помочь диагностировать сетевые проблемы передачи между двумя компаниями

2
ответ дан 5 December 2019 в 13:02
поделиться

Как Вы говорите, вызовы Трассировки только выполняются, когда Вы находитесь в режиме выпуска. Компиляция в режиме Release имеет некоторые выигрыши в производительности, которые можно хотеть в оконечном приложении, и могут быть другие причины, Вы хотите включить режим Release. Однако могут быть времена, когда Вы хотите записать информацию к консоли трассировки, которая может быть просмотрена с приложениями, такими как DbgView SysInternal. Это обычно сообщения, что Вы не обязательно хотите отправить к выводу журнала, или который Вы всегда хотите иметь в наличии для отладки целей, даже если пользователь выключил вход.

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

2
ответ дан 5 December 2019 в 13:02
поделиться
Другие вопросы по тегам:

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