На языке программирования c написать программу для визуализации представления типов данных
Визуализатор — это компонент пользовательского интерфейса отладчика Visual Studio, который отображает переменную или объект способом, подходящим для этого типа данных. Например, HTML-визуализатор интерпретирует строку HTML и отображает результат в том виде, в каком она будет выглядеть в окне браузера. Визуализатор точечных рисунков распознает структуру точечного рисунка и отображает его. Некоторые визуализаторы позволяют не только просматривать, но и редактировать данные.
Отладчик Visual Studio включает шесть стандартных визуализаторов. Визуализаторы текста, HTML, XML и JSON работают со строковыми объектами. Визуализатор дерева WPF отображает свойства визуального дерева объекта WPF. Визуализатор набора данных работает с объектами DataSet, DataView и DataTable.
В будущем могут появиться дополнительные визуализаторы, которые будут доступны для загрузки из корпорации Майкрософт, сторонних компаний и сообщества. Кроме того, вы можете создавать собственные визуализаторы и устанавливать их в отладчик Visual Studio.
В отладчике для обозначения визуализаторов используется значок лупы ( ). Можно выбрать значок в DataTip, окне Контрольные значения отладчика или диалоговом окне Быстрая проверка, а затем выбрать подходящий визуализатор для соответствующего объекта.
Создание пользовательских визуализаторов
Сведения о создании пользовательского визуализатора для машинного кода см. в примере собственного визуализатора отладчика SQLite. Пользовательские визуализаторы не поддерживаются для приложений UWP и Windows 8.x.
Пользовательский визуализатор можно создать для объекта любого управляемого класса, за исключением Object и Array.
Архитектура визуализатора отладчика состоит из двух частей:
Сторона отладчика выполняется в отладчике Visual Studio и создает и отображает пользовательский интерфейс визуализатора.
Сторона отлаживаемого кода — код, который выполняется внутри процесса, отлаживаемого в Visual Studio (отлаживаемая программа). Объект данных для визуализации (например, строковый объект) существует в отлаживаемом процессе. Сторона отлаживаемой программы отправляет объект на сторону отладчика, где он отображается в созданном пользовательском интерфейсе.
Сторона отладчика получает объект данных для визуализации от поставщика объектов. В поставщике объектов реализуется интерфейс IVisualizerObjectProvider. Сторона отлаживаемой программы отправляет объект, используя источник объекта, который является производным от VisualizerObjectSource.
Поставщик объектов может также отправлять данные обратно к источнику объекта, что позволяет создавать визуализаторы, которые могут изменять данные. Поставщик объектов может быть переопределен, чтобы контактировать с вычислителем выражений и, следовательно, с источником объектов.
Сторона отлаживаемой программы и сторона отладчика взаимодействуют друг с другом с помощью методов Stream, выполняющих сериализацию объекта данных в Stream и десериализацию Stream обратно в объект данных.
Можно написать визуализатор для универсального типа, только если тип является открытым. Ограничения накладываются те же, что и при использовании атрибута DebuggerTypeProxy . Дополнительные сведения см. в статье об использовании атрибута DebuggerTypeProxy.
При работе с пользовательскими визуализаторами следует учитывать вопросы безопасности. См. статью Вопросы безопасности визуализатора.
Создание кода для отладочной стороны
Чтобы создать пользовательский интерфейс визуализатора на стороне отладчика, необходимо создать класс, который наследует DialogDebuggerVisualizer, и переопределить метод Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show для отображения интерфейса. Для отображения в визуализаторе форм, диалоговых окон и элементов управления Windows можно использовать интерфейс IDialogVisualizerService.
Используйте методы IVisualizerObjectProvider для получения визуализированного объекта на стороне отладчика.
Создайте класс, который наследует от DialogDebuggerVisualizer.
Переопределите метод Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer.Show для отображения интерфейса. Используйте методы IDialogVisualizerService для отображения в интерфейсе форм, диалоговых окон и элементов управления Windows.
Для обеспечения совместимости метод Show, который был переопределен в предыдущем разделе, по-прежнему включен в IVisualizerObjectProvider. Однако начиная с Visual Studio 2019 версии 16.10, он имеет тип IVisualizerObjectProvider2. Поэтому нужно привести объект objectProvider к обновленному интерфейсу.
При отправке объектов, таких как команды или данные, отлаживаемому объекту используйте метод IVisualizerObjectProvider2.Serialize для передачи этих данных в поток. Этот метод определит оптимальный формат сериализации в зависимости от среды выполнения отлаживаемого процесса. Затем передайте поток в метод IVisualizerObjectProvider2.TransferData .
Если компонент визуализатора на стороне отлаживаемого объекта должен вернуть какие-либо данные отладчику, эти данные будут расположены в объекте Stream, возвращенном методом TransferData. Используйте метод IVisualizerObjectProvider2.GetDeserializableObjectFrom , чтобы получить от него экземпляр IDeserializableObject и обработать его должным образом.
Дополнительные сведения об этой проблеме см. в статье Руководство по безопасности BinaryFormatter.
Создание источника объекта визуализатора для отлаживаемого кода
В коде на стороне отлаживаемого объекта измените DebuggerVisualizerAttribute, предоставив тип для визуализации (источник объекта на стороне отлаживаемого объекта) (VisualizerObjectSource). Свойство Target задает источник объекта. Если источник объекта не задан, визуализатор будет использовать источник объекта, заданный по умолчанию.
Код отлаживаемого объекта содержит источник объекта для визуализации. Объект данных может переопределять методы VisualizerObjectSource. Библиотека DLL на стороне отлаживаемого объекта требуется для создания автономного визуализатора.
В коде на стороне отлаживаемого объекта:
Чтобы разрешить визуализатору изменять объекты данных, источник объекта должен наследоваться от VisualizerObjectSource и переопределять методы TransferData и CreateReplacementObject .
Если нужно включить поддержку многоплатформенного нацеливания в визуализаторе, можно использовать следующие моникеры целевой платформы (TFM) в файле проекта на стороне отлаживаемого объекта.
Это единственные поддерживаемые TFM.
Если визуализатор реализует метод TransferData, используйте новый метод GetDeserializableObject, доступный в последней версии VisualizerObjectSource . Возвращаемый объект IDeserializableObject помогает определить формат сериализации объекта (двоичный или JSON) и десериализовать базовый объект, чтобы его можно было использовать.
Если отлаживаемый объект возвращает данные отладчику в рамках вызова TransferData , сериализуйте ответ в поток на стороне отладчика с помощью метода Serialize.
На языке программирования C++ написать программу для визуализации представления типов данных.
Для любого, введённого пользователем числа, необходимо вывести на экран его представление для следующих типов данных:
Для каждого из вышеперечисленных типов необходимо вывести два варианта представления:
В программе необходимо использовать побитовые операции и операции с указателями.
Input your number: 11
Big-Endian:010000000010011000000000000000000 0000000000000000000000000000000000
Little-Endian:000000000000000000000000000000000 0000000000000000000010
Визуализация данных из COM порта
Доброго времени суток всем! Вывожу с помощью Arduino поток данных на COM port. Мне нужно написать.
Визуализация данных с радара
Помогите сделать нормальную визуализацию данных с радара. Известен угол поворота дальномера, и.
Внутреннее представление типов данных VB6.0. Эквиваленты типов данных VB в C++
Добрый день. Интересует такой вопрос. Где можно почитать, посмотреть научные данные по внутреннему.
Чтение и запись типов, массив типов и List<> данных в файл
Здравствуйте Подскажите способ записи и чтения любых типов данных (не компонентов) Например это: .
Визуализация данных
Подскажите! На форме я расположила DBEdit привязала их к полям таблицы через свойства DataField, но.
Анимация и визуализация данных
Дано: 1)Диаметр окружности dSH. 2)Матрицы: X_sh - координаты элементов (центров окружностей).
Графики и визуализация данных
Всем доброго времени суток. Прощу помощи пока не силен в matlab. Если есть у кого то возможность.
Трёхмерная визуализация научных данных
Всем привет! У меня есть небольшой опыт программирования на c++ с использованием библиотеки Qt. Я.
визуализация загрузки данных в Grid
Привет, хочу сделать визуализацию при загрузке данных(чтобы колесик какой нибудь крутился, на.
Визуализация аналоговых данных в Lazarus
Приветствую всех. Случилось так, что по работе поручили написать одну программу, при том, что.
На языке программирования C++ написать программу для визуализации представления типов данных.
Для любого, введённого пользователем числа, необходимо вывести на экран его представление для следующих типов данных:
Для каждого из вышеперечисленных типов необходимо вывести два варианта представления:
В программе необходимо использовать побитовые операции и операции с указателями.
Input your number: 11
Big-Endian:01000000001001100000000000000000000000000000000000000 00000000000000
Little-Endian:00000000000000000000000000000000000000000000000000000 10
Визуализация данных из COM порта
Доброго времени суток всем! Вывожу с помощью Arduino поток данных на COM port. Мне нужно написать.
Визуализация данных с радара
Помогите сделать нормальную визуализацию данных с радара. Известен угол поворота дальномера, и.
Внутреннее представление типов данных VB6.0. Эквиваленты типов данных VB в C++
Добрый день. Интересует такой вопрос. Где можно почитать, посмотреть научные данные по внутреннему.
Чтение и запись типов, массив типов и List<> данных в файл
Здравствуйте Подскажите способ записи и чтения любых типов данных (не компонентов) Например это: .
Визуализация данных
Подскажите! На форме я расположила DBEdit привязала их к полям таблицы через свойства DataField, но.
Анимация и визуализация данных
Дано: 1)Диаметр окружности dSH. 2)Матрицы: X_sh - координаты элементов (центров окружностей).
Графики и визуализация данных
Всем доброго времени суток. Прощу помощи пока не силен в matlab. Если есть у кого то возможность.
Js - визуализация данных (Joomla2.5+MySQL)
базовые знания - конкретная задача интерактивные графики, диаграммы, кликабельное и прочее работа.
Визуализация многомерных данных в matlab
Здравствуйте. вопрос в следующем: если необходимо построить график зависимости y = f(x), используют.
Визуализация процесса получения данных
Доброго времени суток. Нужно визуализировать процесс получения данных. На форме есть панель, на ней.
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от действующих параметров или выпуска среды. Для изменения параметров выберите пункт Импорт и экспорт параметров в меню Сервис. Дополнительные сведения см. в разделе Сброс параметров.
Код визуализатора должен быть помещен в библиотеку DLL, которая будет читаться отладчиком. Поэтому первым шагом является создание проекта библиотеки классов для библиотеки DLL.
Создание визуализатора вручную
Следуйте приведенным ниже задачам, чтобы создать визуализатор.
Создание проекта библиотеки классов
Создайте новый проект библиотеки классов.
Введите соответствующее имя для библиотеки класса, например MyFirstVisualizer , а затем нажмите Создать или ОК.
После создания библиотеки классов необходимо добавить ссылку на Microsoft.VisualStudio.DebuggerVisualizers.DLL, таким образом вы сможете использовать определенные там классы. Однако, перед добавлением ссылки, необходимо присвоить некоторым классам осмысленные имена.
Чтобы переименовать Class1.cs и добавить Microsoft.VisualStudio.DebuggerVisualizers
Щелкните правой кнопкой мыши Class1.cs в обозревателе решений и выберите команду Переименовать в контекстном меню.
Измените имя с Class1.cs на что-нибудь осмысленное, например, DebuggerSide.cs.
Visual Studio автоматически изменяет объявление класса в DebuggerSide.cs, чтобы оно соответствовало новому имени файла.
В обозревателе решений щелкните правой кнопкой мыши пункт Ссылки и в контекстном меню выберите команду Добавить ссылку.
В диалоговом окне Добавление ссылки на вкладке Обзор выберите Обзор и найдите Microsoft.VisualStudio.DebuggerVisualizers.DLL.
Библиотеку DLL можно найти в подкаталоге \Common7\IDE\PublicAssemblies в каталоге установки Visual Studio.
В файле DebuggerSide.cs добавьте следующее в директивы using :
Теперь можно приступить к написанию отладочной части кода. Этот код запускается отладчиком для отображения информации, которую требуется визуализировать. Прежде всего необходимо изменить объявление объекта DebuggerSide таким образом, чтобы он наследовал базовый класс DialogDebuggerVisualizer .
Наследование от DialogDebuggerVisualizer
В DebuggerSide.cs перейдите к следующей строке кода:
Измените код на:
DialogDebuggerVisualizer имеет один абстрактный метод — Show — который необходимо переопределить.
Переопределение метода DialogDebuggerVisualizer.Show
Добавьте следующий метод в класс public class DebuggerSide :
Добавление пространства имен System.Windows.Forms
В обозревателе решений щелкните правой кнопкой мыши пункт Ссылки и в контекстном меню выберите команду Добавить ссылку.
В диалоговом окне Добавление ссылки на вкладке Обзор выберите Обзор и найдите файл System.Windows.Forms.DLL.
В файле DebuggerSide.cs добавьте следующее в директивы using :
Чтобы отобразить выходные данные визуализатора в диалоговом окне
Добавьте следующую строку кода в метод Show :
В этом примере отсутствует код для обработки ошибок. Следует включать обработку ошибок в настоящем визуализаторе или в любом другом типе приложений.
В меню Сборка выберите команду Собрать MyFirstVisualizer. Построение проекта должно пройти без ошибок. Если при построении все же возникнут ошибки, исправьте их, прежде чем продолжить.
Отладочная часть кода написана. Тем не менее, необходимо выполнить еще одно действие: добавить атрибут, который сообщает отлаживаемому объекту, какой набор классов формирует визуализатор.
Добавление типа для визуализации кода на стороне отлаживаемого объекта
В коде на стороне отладчика тип для визуализации (источник объекта) для отлаживаемого кода указывается с помощью атрибута DebuggerVisualizerAttribute. Свойство Target задает тип для визуализации.
Добавьте следующий код атрибута в DebuggerSide.cs — после директив using , но перед namespace MyFirstVisualizer :
В меню Сборка выберите команду Собрать MyFirstVisualizer. Построение проекта должно пройти без ошибок. Если при построении все же возникнут ошибки, исправьте их, прежде чем продолжить.
На этом написание вашего первого визуализатора окончено. Если вы правильно следовали описанной выше процедуре, можно построить визуализатор и установить его в Visual Studio. Однако перед установкой визуализатора в Visual Studio следует проверить, что он работает правильно. Для этого следует создать тестовое окружение, в котором визуализатор будет запускаться без установки в Visual Studio.
Чтобы добавить тестовый метод для запуска визуализатора
Добавьте следующий метод в класс public DebuggerSide :
В меню Сборка выберите команду Собрать MyFirstVisualizer. Построение проекта должно пройти без ошибок. Если при построении все же возникнут ошибки, исправьте их, прежде чем продолжить.
Далее необходимо создать проект исполняемого файла, из которого будет вызваться библиотека DLL визуализатора. Для простоты выберите проект консольного приложения.
Добавление проекта консольного приложения в решение
В обозревателе решений щелкните правой кнопкой мыши решение, выберите пункт Добавить, а затем щелкните Новый проект.
Введите соответствующее имя для библиотеки класса, например MyTestConsole , а затем нажмите ОК.
Теперь необходимо добавить необходимые ссылки, чтобы программа MyTestConsole могла вызывать MyFirstVisualizer.
Добавление необходимых ссылок в MyTestConsole
В обозревателе решений щелкните правой кнопкой мыши MyTestConsole и в контекстном меню выберите пункт Добавить ссылку.
В диалоговом окне Добавление ссылки на вкладке Обзор выберите Microsoft.VisualStudio.DebuggerVisualizers.DLL.
Щелкните правой кнопкой мыши MyTestConsole и выберите Добавить ссылку еще раз.
В диалоговом окне Добавление ссылки перейдите на вкладку Проекты и выберите MyFirstVisualizer.
Теперь нужно добавить код, которым завершится создание тестового окружения.
Добавление кода в MyTestConsole
Щелкните правой кнопкой мыши Program.cs в обозревателе решений и выберите команду Переименовать в контекстном меню.
Измените имя c Program.cs на что-нибудь более понятное, например на TestConsole.cs.
Visual Studio автоматически изменяет объявление класса в TestConsole.cs так, чтобы оно соответствовало новому имени файла.
В TestConsole.cs добавьте следующий код к директивам using :
В метод Main добавьте следующий код:
Теперь все готово для проверки вашего первого визуализатора.
Тестирование визуализатора
В обозревателе решений щелкните MyTestConsole правой кнопкой мыши и выберите в контекстном меню команду Назначить запускаемым проектом.
В меню Отладка выберите команду Пуск.
Запускается консольное приложение, визуализатор появляется и отображает строку "Hello, World".
Поздравляем! Вы только что создали и протестировали ваш первый визуализатор.
Если вам удобнее вызывать визуализатор из Visual Studio, а не из специально подготовленной тестовой программы, визуализатор необходимо установить. Дополнительные сведения см. в разделе Практическое руководство. установить визуализатор.
Добавление объекта данных на стороне отлаживаемого объекта
В этом разделе вы переключитесь с объекта данных System.String на пользовательский объект данных.
Щелкните Далее. В появившемся диалоговом окне введите имя MyDataObject и нажмите кнопку Создать.
В пространстве имен MyDataObject замените код по умолчанию следующим кодом.
Для визуализатора, доступного только для чтения, как в этом примере, нет необходимости реализовывать методы VisualizerObjectSource.
Затем обновите проект MyFirstVisualizer, чтобы он использовал новый объект данных.
В обозревателе решений в проекте MyFirstVisualizer щелкните правой кнопкой мыши узел Ссылки и выберите команду Добавить ссылку.
В разделе Проекты выберите проект MyDataObject.
В коде атрибута файла DebuggerSide.cs обновите целевое значение, заменив System.String на MyDataObject.CustomDataObject .
В проекте MyFirstVisualizer замените код метода Show следующим кодом.
Приведенный выше код использует свойство объекта данных для отображения в заголовке формы.
Затем обновите консольное приложение, чтобы использовать пользовательский объект данных.
В обозревателе решений в проекте MyTestConsole щелкните правой кнопкой мыши узел Ссылки или Зависимости и добавьте ссылку на проект в MyDataObject .
В файле Program.cs замените код в методе Main следующим кодом.
Консольному приложению требуется ссылка на визуализатор в среде выполнения. Вы можете сохранить ссылку, оставив приведенный выше код, вместо того, чтобы раскомментировать его.
Если приложение запускается с помощью окружения теста, в приложении отображается форма Windows Forms.
После установки визуализатора установите точку останова, запустите консольное приложение и наведите указатель мыши на customDataObject . Если все настроено правильно, отобразится значок лупы .
При выборе MyFirstVisualizer с помощью значка лупы отобразится форма с текстом объекта данных в заголовке.
Создание визуализатора с помощью шаблона элемента визуализатора
На данном пошаговом руководстве было рассмотрено, как создать визуализатор вручную. Это было сделано в качестве упражнения для обучения. Теперь, когда вы знаете, как работает простой визуализатор, можно создать его проще — с помощью шаблона элемента визуализатора.
Во–первых, необходимо создать новый проект библиотеки классов.
Чтобы создать новую библиотеку классов
В меню Файл выберите пункты Создать > Проект.
В средней области выберите Библиотека классов.
В поле Имя введите соответствующее имя для библиотеки класса, например MySecondVisualizer.
Теперь можно добавить элемент визуализатора.
Чтобы добавить элемент визуализатора
В обозревателе решений щелкните правой кнопкой мыши MySecondVisualizer.
В контекстном меню выберите команду Добавить и нажмите кнопку Создать элемент.
В поле Имя введите соответствующее имя, например SecondVisualizer.cs.
Вот и все, что нужно! Просмотрите файл SecondVisualizer.cs для изучения кода, добавленного шаблоном. Можете поэкспериментировать с кодом. Теперь, когда вы изучили основы, вы сможете в будущем создавать свои собственные более сложные и полезные визуализаторы.
Эта статья является продолжением статьи из далекого 2014 года. Напомню, о чем шла речь в прошлой статье.
Какую задачу будем решать
Мы пишем ПО на языке С++, в среде Visual Studio 2015. У нас в проекте, естественно, есть пользовательские типы данных. В качестве примера таких типов могу привести класс MbSolid. Этот класс входит в состав математического ядра C3D и является абстракцией твердого тела. Тело описывается гранями, грани какими-то поверхностями и т.д. Т.е. структура класса довольно сложная, и в процессе отладки собственных алгоритмов хотелось бы визуально прикинуть, какое тело получилось на данный момент.
Картинка из прошлой статьи. В качестве примера пользовательского класса там используется класс отрезка прямой.
Для решения этой задачи было написано расширение для VisualStudio. Тут ничего интересного, ссылки есть в прошлой статье. Но возникла проблема — как в расширении VisualStudio получать данные из адресного пространства отлаживаемого (другого) процесса?
В случае простых типов данных, например массивов, всё не так уж сложно, и Microsoft даже подготовили пример для std::vector. А в нашем случае MbSolid имеет внушительную иерархию наследования и большое количество полей данных.
Модификация пользовательских типов
В прошлой статье был предложен инвазивный вариант решения этой проблемы. В каждый пользовательский класс (который мы хотим визуализировать во время отладки) добавляется поле-маркер. И в каждый не константный метод класса добавляется код для сериализации данных класса в shared memory. В поле-маркере сохраняется адрес в shared memory, куда мы сохранили данные класса. В момент отладки, при просмотре содержимого интересующей нас переменной, расширение VisualStudio находит поле-маркер и десериализует данные из shared memory, ну а дальше как-то визуализирует полученные данные.
По очевидным причинам данное решение не применимо на практике. Особенно если нет доступа к исходному тексту классов, которые мы хотим отлаживать таким способом. Ничего лучше придумать на тот момент не удалось, и эта тема заглохла на несколько лет.
Сервер в пользовательском процессе
В запросе к серверу передается адрес переменной в адресном пространстве отлаживаемого процесса. Т.к. сервер живет в том же процессе, то он без проблем получает доступ к данным по запрашиваемому адресу. Сервер, получив адрес экземпляра класса, приводит этот указатель к типу MbSolid*. Далее сервер создает аппроксимацию этого тела в виде полигональной сетки. Сериализует вычисленные вершины и индексы треугольников в json и отправляет ответ. На стороне VisualStudio расширение получает ответ, десериализует данные и отрисовывает полученную полигональную сетку в окне VisualStudio.
В результате расширению в VisualStudio даже не нужно знать структуру пользовательских данных, ему достаточно уметь отправлять правильные GET-запросы, десериализовать ответ и отрисовать треугольники в окне VisualStudio. Сервер можно расширять. Таким способом можно отлаживать любые пользовательские классы, которые можно представить в виде полигональной сетки или набора отрезков прямых, а расширение VisualStudio сможет их визуализировать:
Более того, таким способом можно даже отправлять запросы нашему серверу из браузера и визуализировать данные процесса с помощью WebGL.
Сделал простой демонстрационный пример. Запускаем наше приложение. Открываем страницу примера в браузере, на странице вводим адрес переменной, отправляем запрос к серверу и отрисовываем ответ. Не знаю, зачем это может понадобиться, но штука прикольная
Оживляем сервер
Все бы хорошо. Но есть одна проблема. Когда срабатывает точка останова, студия останавливает все потоки пользовательского процесса. В результате наш сервер тоже останавливается и не может отвечать на запросы. Для обхода этой проблемы используем следующий костыль: текущий поток, в котором сработала точка останова, замораживается, и пользовательский процесс запускается. В этот момент наш сервер оживает и расширение отправляет ему запрос с адресом интересующей нас переменной. После получения ответа выполнение пользовательского процесса снова приостанавливается, и в качестве текущего потока для дебагера устанавливается изначальный поток, в котором сработала точка останова. Для пользователя это выглядит так, будто ничего не произошло и выполнение программы остановилось в точке останова.
В коде расширения VisualStudio этот костыль выглядит следующим образом. Сработала точка останова. Пользователь запрашивает данные интересующей его переменной. В этот момент мы замораживаем текущий поток и запускаем дебагер:
Посылаем запрос серверу. Получаем ответ. Останавливаем процесс, размораживаем наш поток:
Всё! Мы получили данные от сервера и отрисовали их в окне VisualStudio. Выполнение программы находится в изначальной точке останова.
В завершение хочу отметить, что пока мне непонятны побочные эффекты, которые порождает такой подход. Буду рад, если вы поделитесь вашими соображениями в комментариях к этой статье.
Читайте также: