Программирование >>  Программирование с использованием ajax 

1 ... 50 51 52 [ 53 ] 54 55 56 ... 396


Duplicate maximum found at element index 11. Maximum value 9 found, with 2 occurrences. Maximum value search completed.

The thread <No Name> (0xcc8) has exited with code 0 (0x0) . The thread <No Name> (Oxccc) has exited with code 0 (0x0) . The program [3648] Ch07Ex01.vshost.exe: Managed has exited with code 0 (0x0).

Поток <Без имени> (0xcc8) завершен с кодом О (0x0). Поток <Без имени> (Охссс) завершен с кодом О (0x0).

Программа [3648] Ch07Ex01.vshost.exe: Managed завершена с кодом О (0x0).

5. Переключитесь в режим Release, воспользовавшись раскрывающимся меню в стандартной панели инструментов, как показано на рис. 7.3.

Debug Ц~

Debug

Corif iguftion Manager.

Рис. 7.3. Переключение в режим Release

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

Maximum value 9 found, with 2 occurrences.

The thread <No Name> (0xe2c) has exited with code 0 (0x0). The thread <No Name> (0xd2c) has exited with code 0 (0x0). The program [1736] Ch07Ex01.vshost.exe: Managed has exited with code 0 (0x0).

Поток <Без имени> (OxccS) завершен с кодом О (0x0). Поток <Без имени> (Охссс) завершен с кодом О (0x0).

Программа [3648] Ch07Ex01.vshost.ехе: Managed завершена с кодом О (0x0).

Описание полученных результатов

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

В начале кода присутствует дополнительная директива:

using System.Diagnostics;

Она упрощает доступ к описанным выше функциям, поскольку они содержатся в пространстве имен System. Diagnostics. Без этой директивы using код вроде:

Debug.WriteLine( Bananas );

требовал бы дополнительной квалификации:

System.Diagnostics.Debug.WriteLine( Bananas ) ;

Эта директива using позволяет коду оставаться простым и сокращает количество требуемых слов.

В коде внутри Main () инициализируется тестовый массив целых чисел по имени test Array, а также объявляется еще один целочисленный массив по имени maxVallndices для хранения индексов, которые будет возвращать отвечающая за вычисление функция Maxima О , и затем производится вызов этой функции. После возврата из функции в коде просто выводятся результаты.



Функция Maxima () выглядит несколько более сложно, но никакого особого кода, который еще не был показан ранее, в ней нет. Поиск по массиву выполняется практически тем же самым образом, что и в функции MaxVal (), которая демонстрировалась в главе 6, но только с фиксированием индексов максимальных значений.

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

Поиск начинается с предположения о том, что первый элемент в исходном массиве (который локально именуется integers) является максимальным значением и что в массиве есть только одно максимальное значение. Это позволяет установить значения для параметра maxVal (который представляет возвращаемое значение функции и обнаруженное максимальное значение) и для массива out-параметров indices, который отвечает за хранение индексов обнаруженных максимальных значений. Поэтому maxVal присваивается значение первого элемента в integers, а indices - одно значение О, которое является индексом первого элемента в массиве. Еще осуществляется сохранение количества обнаруженных максимальных значений в переменной count, что позволяет отслеживать состояние массива indices.

Основное тело функции составляет цикл, в котором производится проход по всем значениям в массиве integers, кроме первого, поскольку оно уже было обработано. Каждое значение сравнивается с текущим значением maxVal и игнорируется, если значение maxVal оказывается больше. Если же инспектируемое в текущий момент значение массива оказывается больше maxVal, тогда значения maxVal и indices изменяются соответствующим этому значению образом. Если же оно равно maxVal, тогда происходит увеличение значения переменной count и для indices создается новый массив. Этот новый массив содержит на один элемент больше прежнего массива indices и хранит новый обнаруженный индекс.

Код для обеспечения последней функциональной возможности выглядит следующим образом:

if (integers[i] == maxVal) {

count++;

int[] oldlndices = indices; indices = new int[count]; oldlndices.CopyTo(indices, 0); indices[count - 1] = i;

Debug.WriteLine(string.Format( Duplicate maximum found at element index {0}. ,

i) );

Oh работает за счет сохранения резервной копии старого массива indices в массиве oldlndices, который представляет собой массив целочисленного типа и является локальным по отношения к данному блоку i f. Обратоте внимание на то, что значения в oldlndices копируются в новый массив indices с помощью функции <массив>. СоруТо (). Эта функция берет целевой массив и индекс, в который подлежит скопировать первый элемент, и вставляет все значения в этот целевой массив.

Повсюду в коде осуществляется вывод различных фрагментов текста с помощью функций Debug.WriteLine () и Trace .WriteLine (). Для вложения значений пере-



менных в строки так же, как и в случае использования Console.WriteLine (), в этих функциях применяется string.Format (). Такой подход является немного эффективнее операции конкатенации +.

При запуске приложения в режиме Debug отображается перечень всех шагов, которые выполняются для получения результата. В режиме Release отображается только результат вычисления, поскольку в рабочих сборках никаких вызовов функции Debug. WriteLine () не производится.

Помимо этих функций WriteLine () существует еще несколько, о которых следует знать. Во-первых, доступны эквиваленты функции Console .Write ():

□ Debug.Write О

□ Trace.Write О

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

Во-вторых, существуют следующие команды:

□ Debug.WriteLinelf ()

□ Trace.WriteLinelf ()

□ Debug.WritelfО

□ Trace.WritelfО

Каждая из них имеет те же самые параметры, что и ее не содержащий If аналог, плюс один дополнительный обязательным параметр, который предшествует всем остальным в списке. Этот параметр принимает значение типа Boolean (или вычисляющееся в такое значение выражение) и приводит к тому, что функция выводит текст только в том случае, если это значение равно true. Эти функции можно применять для обеспечения вывода текста в окно Output на базе каких-то условий.

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

Точки трассировки

Точка трассировки (tracepoint) представляет собой средство, доступное только в VS и отсутствующее в VCE. Поэтому те, кто использует УСЕ, при желании могут пропустить этот раздел.

Альтернативой выводу информации в окно Output является применение точек трассировки. Они являются средством VS, а не языка С#, но служат для той же самой цели, что и функция Debug .WriteLine (). По сути, они позволяют выводить отладочную информацию без внесения изменений в код.

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

1. Поместите курсор на строку, где требуется вставить точку трассировки. Точка трассировки будет обрабатываться перед выполнением этой строки кода.



1 ... 50 51 52 [ 53 ] 54 55 56 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика