1

голосов
1

ответ
60

Просмотры

Получить различные комбинации из наборов

У меня есть различные наборы, идентифицированных некоторые имена, против которых существует значение. Я использую построить как словарь для хранения таких объектов. Как мой выход мне нужно все возможные комбинации значений, которые могут быть сгенерированы из этого входного синтаксиса. В моих попытках, я разработал подход, основанный на указательный такой, что если индексы правильно манипулировать, я бы получить необходимые выходные формы, аналогичного пример. Я понимаю, что он мог бы использовать рекурсию, но я не уверен, как идти об этом. Является ли это общепризнанная проблемой? Вы можете найти код ниже: с помощью системы; используя System.Collections.Generic; Пространство имен Rextester {общественного класса Program {частный статический словарь dataAtIndex (словарь iArgs, словарь iArgIndex) {словарь oConditionKeys = новый словарь (); Еогеасп (вар vArgName в iArgs. Клавиши) {INT индекс = iArgIndex [vArgName]; Строка argValue = iArgs [vArgName] [индекс]; oConditionKeys.Add (vArgName, argValue); } Вернуть oConditionKeys; } Частных статических аннулируются testFunc (Словарь iArgs, реф Список oListSelectKeys) {словарь argIndex = новый словарь (); Еогеасп (вар vArgName в iArgs.Keys) {argIndex.Add (vArgName, 0); } oListSelectKeys.Add (dataAtIndex (iArgs, argIndex)); } государственной статической силы Main (string []) {mainargs словарь Args = новый словарь (); Список listArgData1 = новый список (); listArgData1.Add ( "1 => arg0"); listArgData1.Add ( "1 => Arg1"); listArgData1.Add ( "1 => Arg2"); Список listArgData2 = новый список (); listArgData2.Add ( "2 => arg0"); listArgData2.Add ( "2 => Arg1"); Список listArgData3 = новый список (); listArgData3.Add ( "3 => arg0"); listArgData3.Add ( "3 => Arg1"); listArgData3.Add ( "3 => Arg2"); listArgData3.Add ( "3 => Arg3"); args.Add ( "Param1", listArgData1); args.Add ( "Param2", listArgData2); args.Add ( "Param3", listArgData3); Console.WriteLine ( "Ввод данных:"); Еогеасп (вар vKey в args.Keys) {Console.Write (vKey + ":"); Еогеасп (вар VDATA в арг [vKey]) {Console.Write (Vdata + ",«); } Console.WriteLine (); } Console.WriteLine (); Список listSelectKeys = новый список (); testFunc (арг, реф listSelectKeys); Количество INT = 0; Console.WriteLine ( "Выходные данные:"); Еогеасп (вар Velem в listSelectKeys) {Console.Write (кол ++ + ":"); Еогеасп (вар vKey в vElem.Keys) {Console.Write ( "(" + vKey + "" + Velem [vKey] + ")"); } Console.WriteLine (); }}}} Вывод должен быть, как: 0: (Param1, 1 => arg0) (param2, 2 => arg0) (param3, 3 => arg0) 1: (Param1, 1 =>
user2338150
1

голосов
1

ответ
452

Просмотры

Передача РУЧКИ в DLL

Я новичок в программировании Win32. Я пытаюсь передать HANDLE, полученный с помощью CreateFile () к функции в DLL. Но при попытке прочитать байты, dwBytesRead говорит 0. Могу ли я передать РУЧКИ записям DLL? Я читал здесь [Написание библиотеки DLL], что ресурсы вызывающего абонента не принадлежат к вызываемому абоненту, и, следовательно, я не должен называть CloseHandle () или что-то вроде бесплатно () для таНос () в вызывающей программе. Является ли мое понимание правильно? Просьба указать меня в правильном направлении. Вот код: main.c #include #include #include #include #define BufferSize 5 INT __declspec (DllImport) привет (HANDLE); недействительный __cdecl _tmain (интермедиат ARGC, TCHAR * ARGV []) {HANDLE hFile; Е ( "\ п"); если (! ARGC = 2) {Е ( "Ошибка использования: Неверное количество аргументов \ п \ п"); _tprintf (ТЕКСТ ( "Использование: \ п \ т% s \ п"), ARGV [0]); вернуть; } HFile = CreateFile (ARGV [1], // Файл, чтобы открыть GENERIC_READ, // открыть для чтения FILE_SHARE_READ, // ресурс для чтения NULL, // по умолчанию OPEN_EXISTING безопасности // существующий файл только FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // обычный файл НОЛЬ); // нет атр. Шаблон, если (hFile == INVALID_HANDLE_VALUE) {_tprintf (TEXT ( "Терминал сбой: не удалось открыть файл \" "для чтения \ п" % S \), ARGV [1]); вернуть; } Е ( "Поступил основной, вызов DLL \ п."); привет (hFile); Е ( «Назад в основном, выход \ п.»); CloseHandle (hFile); } Привет. C # include # include # include # include #define BufferSize 5 DWORD g_BytesTransferred = 0; VOID CALLBACK FileIOCompletionRoutine (__in DWORD dwErrorCode, __in DWORD dwNumberOfBytesTransfered, __in LPOVERLAPPED lpOverlapped) {_tprintf (TEXT ( "Код ошибки: \ т% х \ п"), dwErrorCode); _tprintf (ТЕКСТ ( "Число байтов: \ т% х \ п"), dwNumberOfBytesTransfered); g_BytesTransferred = dwNumberOfBytesTransfered; } INT __declspec (dllexport) Привет (HANDLE hFile) {DWORD dwBytesRead = 0; символ ReadBuffer [BufferSize] = {0}; OVERLAPPED ол = {0}; если (== FALSE, ReadFileEx (hFile, ReadBuffer, BufferSize-1, & ол, FileIOCompletionRoutine)) {DWORD LastError = GetLastError (); Е ( "Терминал отказ: Не удается прочитать из файла \ п GetLastError =% 08x \ п", LastError); вернуться LastError; } DwBytesRead = g_BytesTransferred; если (dwBytesRead> 0 && dwBytesRead
user2338150
1

голосов
1

ответ
46

Просмотры

Разрешить только авторизованный код для вызова подпрограммы в библиотеке

Хорошо, я попробую объяснить мое использование сценария здесь: У меня есть осуществление основной библиотеки которых самый низкий уровень доступ является API-интерфейсы для ввода данных в БД, которые должны быть самодостаточными как подсистема. Теперь, по странным причинам эта библиотеки обнажая критические параметры этой БД, как Login ID и пароль и т.д. Он предназначен для использования только для «внутренней» коды некоторых большого приложения, разработанного одной и той же командой, и идея заключается в том, чтобы препятствовать использованию этих API, другими клиентами 3-й партии, которые имеют доступ к одной и той же библиотеки в двоичном виде. Это та часть, где он получает больше уродливее. Для реализации этой достаточно «секретной» функции простой реализацией ранее решили секретного ключ придуманная. Скажем, такой код: строка SecretKey = "ли ... $$$"; Строка пароля = библиотека :: secretGetPwd (SecretKey); Это используется в нескольких местах, а функция работает только тогда, когда SecretKey правильно. Это не похоже, хороший подход и может быть легко обнаружено. Однако, это вызывает в нескольких местах предупреждений нескольких магических строк, что делает инструмент ворса очень несчастным. Задача состоит в том, чтобы удалить только эти предупреждения пуха. Может кто-то предложить некоторые «лучший» худший способ реализации этого?
user2338150
3

голосов
3

ответ
255

Просмотры

Структура данных Выравнивание: Linker или Compiler

Из задачи которых делает выравнивание структуры данных соответствует? Является ли это компилятор, компоновщик, загрузчик или само оборудование, как и в случае x86? Имеет ли относительное соответствие компилятор адресации, таким образом, что, когда «помещено» правильно линкер в скомпилированных исполняемых, данные-структурах всегда выровнены с границами соответствующих родного размера? Что еще задача делает загрузчик должен делать в дальнейшем?
user2338150
2

голосов
1

ответ
144

Просмотры

Автоматическая вставка кода в TASM

Я пытаюсь написать простой запуск C для получения DOS COM-файл. Я еще не написал ARGC, реализации ARGV. В качестве теста, я пытаюсь поставить фиктивный ARGV [0], и ARGC = 1. Но я получаю 2 неожиданные линии, как на свалке:; -------------------------------------- ------------------------- Turbo Debugger Вход процессор 80486 CS: 0100B85902 мы ах, 0259 CS: 0103 50 толчка ах CS: 0104 BF5002 мов ди, 0250 CS: 0107 FF35 толчок слово PTR [ди] CS: 0109 90 NOP;
user2338150
2

голосов
3

ответ
68

Просмотры

Условное определение макроса для эмуляции по умолчанию определяет

Я работаю на некоторые геометрии на основе кода. Задача в предполагает использование ограничительной рамки, чтобы содержать твердый образец. Теперь, в коде я разработал два различных типа таких коробок, а именно INNER_BOUNDING_BOX и OUTER_BOUNDING_BOX. Код далее ожидает использование любого одного из двух коробок, но не оба. Я пытаюсь добиться этого за счет использования препроцессора. Я написал дальнейший код, основанный на несколько макросов, а именно USE_INNER_BOUNDING_BOX и USE_OUTER_BOUNDING_BOX. Я могу гарантировать, что в любой момент времени любой один макрос определяется через некоторую простую конструкцию, как это: #if определено (USE_INNER_BOUNDING_BOX) && определена (USE_OUTER_BOUNDING_BOX) #undef USE_INNER_BOUNDING_BOX #undef USE_OUTER_BOUNDING_BOX #define USE_INNER_BOUNDING_BOX #endif #ifndef USE_INNER_BOUNDING_BOX #ifndef USE_OUTER_BOUNDING_BOX #define USE_INNER_BOUNDING_BOX #endif #endif Теперь, если я хотел бы использовать какую-либо конкретную форму, я мог бы просто определить соответствующий макрос. Трудности возникают с желанием для использования макросов в настройках по умолчанию сказать USE_DEFAULT_BOUNDING_BOX, который я мог бы использовать, чтобы затем установить определить для любого из USE_INNER_BOUNDING_BOX или USE_OUTER_BOUNDING_BOX, когда оба или ни один из них явно. Я бы склонен к переносимого кода, но компилятор конкретных трюк может также передать. Я использую Visual Studio 2012. Трудности возникают с желанием для использования макросов в настройках по умолчанию сказать USE_DEFAULT_BOUNDING_BOX, который я мог бы использовать, чтобы затем установить определить для любого из USE_INNER_BOUNDING_BOX или USE_OUTER_BOUNDING_BOX, когда оба или ни один из них явно. Я бы склонен к переносимого кода, но компилятор конкретных трюк может также передать. Я использую Visual Studio 2012. Трудности возникают с желанием для использования макросов в настройках по умолчанию сказать USE_DEFAULT_BOUNDING_BOX, который я мог бы использовать, чтобы затем установить определить для любого из USE_INNER_BOUNDING_BOX или USE_OUTER_BOUNDING_BOX, когда оба или ни один из них явно. Я бы склонен к переносимого кода, но компилятор конкретных трюк может также передать. Я использую Visual Studio 2012.
user2338150
3

голосов
3

ответ
5.6k

Просмотры

Относительный переход из диапазона от 0020h байтов

Я пытался написать основное ком файл для «оболочки». Я был в состоянии собрать один и тот же код в NASM с небольшими изменениями. Однако этот код не будет собираться в TASM! Я получаю ошибки типа: относительный скачок из диапазона Я посмотрел немного на Google, чтобы узнать о скачках. Однако я не мог найти много, кроме идеи разорвать этот прыжок в относительно короткие прыжки. Есть ли быть аккуратнее альтернатива? Вот код: .MODEL крошечное CR EQU 13d LF EQU 10d TAB фас 09D .data быстрое дб CR, LF, "Input:" 0 tab_max дб 7 DUP ( '_'), 0 дБ входной 128 DUP (0); Входной буфер 80 байт str_ver дб CR, LF, CR, LF, CR, " " \ "Версия: 1.0", CR, LF, 0 str_help дб CR, LF, CR, LF, CR,"", \ «Тип VER Для версии !!!», \ CR, LF, CR " " \ "Тип CLS Чтобы очистить экран !!!", \ CR, LF, CR",", \ "Тип HELP показывать это сообщение !!!", \ CR, LF, 0 str_welcome дб «Добро пожаловать Моей операционной системы !!! "0 str_default дб CR, LF, CR, LF, CR", "\ "Invalid Command !!!", \ CR, LF, CR," "\" Тип HELP Для отображения Помогите !!!», \ CR, LF, 0 cmd_ver дб "VER", 0 cmd_help дб "HELP", 0 cmd_cls дБ "CLS", 0 .code орг 100h главный прок вблизи исключающего топор, топор; Выберите Video Mode Функции мы аль, 03h; Выберите 80x25 (8 страниц) Текстовый режим INT 10h; Вызов прерывания мов дк, 0h; Ряд мы дли, 0h; Колонка вызов goto_xy мы се, 30h Леа си, [Str_welcome] называть put_str Begin0: Lea си, [приглашение]; Отображение строки мов ого, 0AH; Максимальная длина = 10 вызова put_str вызова звуковой сигнал Lea си, [вход] вызов null_str; Утилизировать Входной буфер мов ого, 60h; Максимальная длина = 64 вызова get_str; Read User Input вызова del_whitespace; Покончить с Ведущими и завершающим пространства символами называют str_to_upper; Преобразование в прописном chk_internal вызова; Cross-Check In внутренние команды JMP Begin0; Loop навсегда ENDP null_str прок рядом толчок си; Сохранить SI толчок сх; Сохранить CX толчок топор; Сохранить AX исключающее топор, топор вызов str_len; Перемещение Длина строки В CX .more0: CMP сх, 0; Является ли это нулевая длиной? JZ .finish0; Если так Покончить с мами [Si], топором; Нулевой символ в входном буфере разл сх; Декремент счетчика вкл си; Advance SI JMP .more0; Loop On До Первой 0 .finish0: поп-ах; Получить AX поп-сх; Получить BX поп-си; Получить SI RET; Возвращение ENDP del_whitespace процедурный вблизи нажимной си; Сохранить SI нажимной ди; Сохранить DI толчок йх; Сохранить DX толчок сх; Сохранить CX толчок BX; Сохранить BX толкать топор; Сохранить AX XOR топор, топор исключающего Ое, Ьй исключающее сй, сй исключающее дй де мы ди, си си декабря; СИ = СИ-1 .loop00: вкл си; Go On Приращение Индекс Строки Источника XOR ого, де дх мы, [Si] XOR Д.Х. дк CMP DL, 00h; Закончена Строка? JZ .chomp00 CMP дл, 20h; Is It A Space JZ .loop00; Go On Питание Spaces КСС Д.Л., TAB; Действительно ли это TAB JZ .loop00; Go On Питание ВКЛАДКИ нажимной си; Список первого непробельного символа в строке, вкл сй; Количество лексем в строковых .loop01: вкл си; Приращению SI MOV DX, [Si] XOR дк, дк CMP дх, 00h; Закончена Строка? JZ .chomp00; Cut Out Полезная часть КСС Dx, 20h; Check For Space JZ .loop00 КСС йх, TAB; Check For TAB JNZ .loop01; Читать далее до следующего TAB JZ .loop00 .chomp00: КСС ого, 00h; Входной JZ Null .over01; Возвращение Тогда разл сх; В противном случае Decrement Количество лексем поп си; Начало отделочных Токен мов топор, Si; Сохранить его, на всяком случае также становится началом первой лексемы .bypass: ИНК си; Индекс Строки Increment мов ах, [си] исключающий дк, дк CMP дх, 00h; Закончилась строка? JZ .loop002 ЧМК дх, 20h JZ .loop002 ЧМК дх, TAB JNZ .bypass; Обход всех символов Токен До первой Whitespace .loop002: мы Ого, си; Найдено End CMP сх, 00h; Является Там только один маркер? JZ .inst00; Затем Start отделочного токен = Начало открытия токена .loop02: реш сх поп топор; Переместить начало предыдущего лексема AX КСС ого, 00h; Все токены Закончено? JZ .inst00 JNZ .loop02; Loop Over .inst00: мы си, топор; Установить SI начать .loop03: CMP си, BX; Все персонажи в знак Обработанные? JZ .over00; Готово, возвращенные мы ах, [си] мы [ди], дй; В противном случае перезапись входной строки вкл си; Increment User Index Токен Input вкл ди; Приращение Обработанные Токен Input Index JMP. loop03; Цикл по .over00: исключающей ому дм мы [ди], дй; NULL-Terminate Обработанные Токен .over01: поп топор; Получить AX поп-BX; Получить BX поп-сх; Получить CX поп йх; Получить DX поп-ди; Получить DI поп-си; Получить SI RET; Возвращение ENDP clr_scr ргос вблизи нажимной топор; Сохранить AX нажимной BX; Сохранить BX нажмите сх; Сохранить CX толчок ах; Сохранить DX исключающее дх дх; Курсор В Top-Left вызова goto_xy мы ах, 6; Прокрутка вверх весь экран мов Al, 0; Цвет текста: Белый мов ЧД, 7; Фон: Черный исключающее сх, сх; Топ-левые мы дк, 24; Самый нижний Mov дл, 79; Правое Большинство INT 10h поп-ах; Получить DX поп-сх; Получить CX поп-BX; Получить BX поп топор; Получить AX RET ENDP chk_internal процедурный вблизи нажимной си; Сохранить SI толчок сх; Сохранить CX cmd_ver_lb: Леа ди [cmd_ver]; VER Вызов команд cmp_str; Сравнить пользователя Входной JNC .do_ver; Выполнить команду Если Сопрягано cmd_help_lb: Леа ди [cmd_help]; HELP Команда вызова cmp_str; Сравнить пользователя Входной JNC .do_help; Выполнить команду Если Сопрягано cmd_cls_lb: Леа ди [cmd_cls]; CLS Команда вызова cmp_str; Сравнить User Input JNC .do_cls; Выполнить команду Если Сопрягано default_lb: Леа си, [str_default]; По умолчанию Сообщение об ошибке мов сх, 60h; Max Length 60Hex символов называют put_str JMP .clean0; Возвращение .do_ver: Леа си, [str_ver]; Строка для VER мов сх, 40h; Max Length 40Hex символов называют put_str JMP .clean0; Возвращение .do_help: Леа си, [str_help]; Строка для HELP мов сх, 80h; Max Length 80Hex символов называют put_str JMP .clean0; Возвращение .do_cls: вызов clr_scr; Вызов Clear Screen Функция JMP .clean0; Возвращение .clean0: поп-ого; Получить CX поп-си; Получить SI RET; Возвращение ENDP get_xy процедурный вблизи нажимной топора; Сохранить AX XOR топор, топор мов ах, 03h; Выберите Поместить курсор Функция 10h INT; Вызов прерывания поп топор; Получить AX в отставке ENDP goto_xy процедурный вблизи нажимной топора; Сохранить AX нажимной BX; Сохранить BX нажмите сх; Сохранить CX толчок ах; Сохранить DX исключающее топор, топор исключающих сй, се мы ах, 02h; Выберите Put Курсор Функция мов ЧД, 00h; Выберите страницу (0-7) прерывание 10h; Вызов прерывания поп йх; Получить DX поп-сх; Получить CX поп-BX; Получить BX поп топор; Получить AX в отставке ENDP cmp_str процедурный вблизи нажимной си; Сохранить SI нажимной ди; Сохранить DI толчок топор; Сохранить AX нажимной BX; Сохранить BX нажмите сх; Сохранить CX CLC; По умолчанию: Clear Carry называют str_len; Длина строки СИ мов ах, сх; Копирование строк длины СИ В АХ нажимной си; Сохранить SI MOV BX, ди мов си, BX; Перемещение DI для SI вызова str_len; Длина строки ди Mov Ьх, сх; Копирование строки длина Д.И. В BX поп-си; Получить Назад SI КСС топор, BX; Проверьте, если строка Длина равна JNZ .nosame; Не Same loop0: мы аль, [си]; Загрузить следующий символ из SI А. Л. мов бл, [ди]; Загрузить следующий символ из DI Б.Л. КСС ал, бл; Сравнение двух символов JNZ .nosame; Не же или аль аль; Проверьте, если AL = 0 JZ Loop0Done; AL = 0? Тогда Return вкл си; Приращение С.И. вкл ди; Приращение DI JMP loop0 .nosame: STC; Установите Carry Flag Loop0Done: поп-сх; Получить CX поп-BX; Получить BX поп топор; Получение AX поп-ди; Получить DI поп-си; Получить Ši RET ENDP put_str процедурный вблизи нажимной си; Сохранить SI толчок топор; Сохранить AX нажимной сх; Сохранить CX Печать: CMP сх, 0h; Проверьте, если CX = 0 JZ PrintDone; Дон» т Bother Печать Дальнейшая LODSB; Загрузить следующий символ из SI в AL или Al, Al; Проверьте, если AL = 0 JZ PrintDone; AL = 0? Затем Возвращение put_chr вызова; Иначе перейти к печати символов разл сх; Decrement Счетчик JMP печать PrintDone: поп-ая; Получить CX поп-ах; Получить AX поп-си; Получить Ši RET ENDP put_chr процедурный вблизи нажимной топора; Сохранить AX CMP AL, TAB; Проверить наличие символа табуляции JNZ no_tab; Пропустить Tab обработки нажимной си LEA си, [tab_max]; Вкладка Строка пространств (7) толчок сх мов сх, 07D вызов put_str; Печать Out Tab символы поп-се попы-си JMP Key_Tab; Не печатать ASCII 09D (TAB) no_tab: мы ах, 0eh; Выберите Печать Символ Функция INT 10h; Печать символов Key_Tab: поп топор; Получить AX в отставке ENDP get_ch процедурный около ReadLoop1: мов ах, 0; Read Key Opcode INT 16h КСС Al, 0; ALT, SHIFT, CTRL и т.д. JZ ReadLoop1, если это так, не эхо при нажатии этой клавиши, называют put_chr RET ENDP get_chr прок рядом ReadLoop2: мы ах, 0; Read Key Opcode INT 16h КСС Al, 0; ALT, SHIFT, CTRL и т.д. JZ ReadLoop2; Если да, то не эхо при нажатии этой клавиши put_chr вызова; Эхо Character RET ENDP get_str прок вблизи нажимной си; Сохранить SI толчок топор; Сохранить AX нажимной BX; Сохранить BX нажмите сх; Сохранить CX MOV BX, SI; Скопировать Initial Address Count0: вызов get_ch CMP аль, 08D JZ .bksp ЧМК аль, 13г JZ Count0Done CMP сх, 0h JZ Count0 JMP .next .bksp: CMP BX, SI; Действительно ли это первый ключ? JZ Count0; Вернуться Затем нажмите топор; Сохранить AX разл си; Снижение на один символ вкл сх; Free Up Deleted Character CMP [си], TAB; Действительно ли это TAB? JZ .is_tab толчок Ого толчка ого толчка дх исключающие Ьй, BX; Выберите видео Page 0 вызов get_xy; Читайте позицию курсора в DX КСС дл, 0h; Является ли это первый столбец? JZ. f_col00 мов аль, 08h; Печать Backspace вызова put_chr мы Al, 20h; Печать Космического вызов put_chr мы аль, 08h; Печать Backspace называют put_chr JMP .n_col00 .f_col00: декабрь дк; Перейти к предыдущей строке; Предполагает DH> 0 мов Д.Л., 79d; Максимальное количество столбцов называют goto_xy; Поместите курсор мов Al, 20h; Печать Космический вызов put_chr мов дл, 79d; Максимальное количество столбцов называют goto_xy; Поместите курсор .n_col00: поп йх поп-сх попы Ого JMP .not_tab .is_tab: толчок сх мов сй, 07D .loop_tab: толчок Ого толчка сй нажимной дй исключающей Ьй, BX; Выберите видео Page 0 вызов get_xy; Читайте позицию курсора в DX КСС дл, 0h; Является ли это первый столбец? JZ .f_col01 мы аль, 08h; Печать Backspace вызова put_chr мы Al, 20h; Печать Космического вызов put_chr мы аль, 08h; Печать Backspace называют put_chr JMP .n_col01 .f_col01: декабрь дк; Перейти к предыдущей строке; Предполагает DH> 0 мов Д.Л., 79d; Максимальное количество столбцов называют goto_xy; Поместите курсор мов Al, 20h; Печать Космический вызов put_chr мов дл, 79d; Максимальное количество столбцов называют goto_xy; Поместите курсор .n_col01: поп ах поп-се попы Ого разл ого КСС ого, 0 JNZ. loop_tab поп сх .not_tab: XOR ах, ах мы [Si], ах; Сброс удаленных символов с целью 0 поп-ах JMP Count0 .next: КСС сх, 0h; Является ли буфер уже заполнен? JZ Count0; Go Back And Wait For BkSp или ENTER разл сх; Decrement Макс Длина строки вызова put_chr мов [Si], др вкл си; Приращение SI JMP Count0 Count0Done: поп-сх; Получить CX поп-BX; Получить BX поп топор; Получить AX поп-си; Получить Ši RET ENDP str_len процедурный вблизи нажимной топора; Сохранить AX нажимной си; Сохранить SI исключающее сх, сх; Инициализировать счетчик Count: LODSB; Загрузить следующий символ из SI в AL или Al, Al; Проверьте, если AL = 0 JZ CountDone; AL = 0? Тогда Return вкл сх JMP Count CountDone: поп-си; Получить SI поп топор; Получить AX в отставке ENDP chr_to_upper процедурный вблизи нажимной BX; Сохранить BX нажмите сх; Сохранить CX толчок топор; Сохранить AX мов бл, аль мов Al, 'а' КСС бл, Al; Является ли символ < 'а' JL .notlc; Другое мов аль, «г» CMP бл, аль; Является Character> 'г' JG .notlc; Другие мы аль, 20h к югу бл ала; Преобразование в прописные XCHG ал, бл; Обмен AL и BL JMP .lc; Строчные Обработанные .notlc: поп топор; Получить AX JMP .clear1 .lc: поп-сх; Отходы AX .clear1: поп-сх; Получить CX поп-BX; Получить BX RET ENDP chr_to_lower процедурный вблизи нажимной BX; Сохранить BX нажмите сх; Сохранить CX толчок топор; Сохранить AX мов бл, ал мов Al, 'A' КСС бл, Al; Является ли символ < 'A' JL .notuc; Другое мов аль, «Z» CMP бл, аль; Является Character> 'Z' JG .notuc; Другие мы аль, 20h добавить бл ала; Преобразование в строчные XCHG ал, бл; Обмен AL и BL JMP .uc; Прописные Обработанные .notuc: поп топор; Получить AX JMP .clear2 .uc: поп-сх; Отходы AX .clear2: поп-сх; Получить CX поп-BX; Получить BX RET ENDP str_to_upper процедурный вблизи нажимной си; Сохранить SI толчок топор; Сохранить AX Count1: мы аль, [си] CMP аль, 0h; Проверьте, если AL = 0 JZ Count1Done; AL = 0? Тогда Return мов Al, 'A' CMP [си], ал; Является ли символ < 'а' JL .Other1; Другое мов аль, 'г' CMP [Si], др; Является Character> 'г' JG .Other1; Другое мов аль, 20h к югу [Si], др; Преобразование в прописные .Other1: вкл си; Приращение SI JMP Count1 Count1Done: поп топор; Получить AX поп-си; Получить Ši RET ENDP str_to_lower процедурный вблизи нажимной си; Сохранить SI толчок топор; Сохранить AX count2: мы аль, [си] или др, др; Проверьте, если AL = 0 JZ Count2Done; AL = 0? Тогда Return мов Al, 'A' CMP [си], ал; Является ли символ < 'A' JL .Other2; Другое мов аль, 'Z' CMP [Si], др; Является Character> 'Z' JG .Other2; Другое мов аль, 20h добавить [Si], др; Преобразование в строчные .Other2: вкл си; Приращение SI JMP count2 Count2Done: поп топор; Получить AX поп-си; Получить Ši RET ENDP звук процедурный вблизи толчок топора нажимной сх мов сх, топор; Временно Сохранить Примечание Значение мов Al, 182 из 43h, аль мов ах, сх; Настройка частоты из 42h, аль мов аль, а из 42h, аль в аль, 61h; Включите динамик ПК или др, 03h 61h из ал поп-се попы-ах RET задержки ENDP прок около os_pause: нажимного топора КССА топора, 0 JE .time_up; Если задержка = 0, то выручать мы Cx, 0 мов [.counter_var], сй; Нулевого значения счетчика переменных мов BX, ах мы ах, 0 мы ал, 1; 1 * 55ms = 55mS MUL BX; Умножение на числе 55ms кусков требуются мы [.orig_req_delay], топор; Сохранить это Mov ах, 0 Int 1AH; Получить тик счета мов [.prev_tick_count], Dx; Сохраните его для последующего сравнения .checkloop: мы ах, 0 INT 1Ah; Получить тик счета снова КСС [.prev_tick_count], Dx; Сравнение с предыдущим клещ счетчик JNE .up_date; Если он изменил проверить его JMP .checkloop; В противном случае подождите еще немного .time_up: поп топор в отставке .up_date: мы ах, [.counter_var]; Inc counter_var вкл ах мы [.counter_var], ах ах CMP, [.orig_req_delay]; Является ли counter_var = требуемая задержка? JGE .time_up; Да, так выручать мы [.prev_tick_count], Dx; Нет, так обновить .prev_tick_count JMP .checkloop; И идти ждать еще немного .orig_req_delay Dw 0 .counter_var Dw 0 .prev_tick_count Dw 0 ENDP немого процедурный вблизи нажимной топора в аль, 61h и др, 0FCh из 61h, аль поп топор RET ENDP гудок прок вблизи толчок топор мов топор, 560d; Звук Тон вызова звук исключающее топор, топор мов ах, 02h; 110 миллисекунд вызова вызова задержка отключения звука поп-ах RET конец ENDP основные counter_var]; Inc counter_var вкл ах мы [.counter_var], ах ах CMP, [.orig_req_delay]; Является ли counter_var = требуемая задержка? JGE .time_up; Да, так выручать мы [.prev_tick_count], Dx; Нет, так обновить .prev_tick_count JMP .checkloop; И идти ждать еще немного .orig_req_delay Dw 0 .counter_var Dw 0 .prev_tick_count Dw 0 ENDP немого процедурный вблизи нажимной топора в аль, 61h и др, 0FCh из 61h, аль поп топор RET ENDP гудок прок вблизи толчок топор мов топор, 560d; Звук Тон вызова звук исключающее топор, топор мов ах, 02h; 110 миллисекунд вызова вызова задержка отключения звука поп-ах RET конец ENDP основные counter_var]; Inc counter_var вкл ах мы [.counter_var], ах ах CMP, [.orig_req_delay]; Является ли counter_var = требуемая задержка? JGE .time_up; Да, так выручать мы [.prev_tick_count], Dx; Нет, так обновить .prev_tick_count JMP .checkloop; И идти ждать еще немного .orig_req_delay Dw 0 .counter_var Dw 0 .prev_tick_count Dw 0 ENDP немого процедурный вблизи нажимной топора в аль, 61h и др, 0FCh из 61h, аль поп топор RET ENDP гудок прок вблизи толчок топор мов топор, 560d; Звук Тон вызова звук исключающее топор, топор мов ах, 02h; 110 миллисекунд вызова вызова задержка отключения звука поп-ах RET конец ENDP основные Да, так выручать мы [.prev_tick_count], Dx; Нет, так обновить .prev_tick_count JMP .checkloop; И идти ждать еще немного .orig_req_delay Dw 0 .counter_var Dw 0 .prev_tick_count Dw 0 ENDP немого процедурный вблизи нажимной топора в аль, 61h и др, 0FCh из 61h, аль поп топор RET ENDP гудок прок вблизи толчок топор мов топор, 560d; Звук Тон вызова звук исключающее топор, топор мов ах, 02h; 110 миллисекунд вызова вызова задержка отключения звука поп-ах RET конец ENDP основные Да, так выручать мы [.prev_tick_count], Dx; Нет, так обновить .prev_tick_count JMP .checkloop; И идти ждать еще немного .orig_req_delay Dw 0 .counter_var Dw 0 .prev_tick_count Dw 0 ENDP немого процедурный вблизи нажимной топора в аль, 61h и др, 0FCh из 61h, аль поп топор RET ENDP гудок прок вблизи толчок топор мов топор, 560d; Звук Тон вызова звук исключающее топор, топор мов ах, 02h; 110 миллисекунд вызова вызова задержка отключения звука поп-ах RET конец ENDP основные аль поп-ах RET ENDP гудок прок вблизи нажимной топор мов топора, 560d; Звук Тон вызова звук исключающее топор, топор мов ах, 02h; 110 миллисекунд вызова вызова задержка отключения звука поп-ах RET конец ENDP основные аль поп-ах RET ENDP гудок прок вблизи нажимной топор мов топора, 560d; Звук Тон вызова звук исключающее топор, топор мов ах, 02h; 110 миллисекунд вызова вызова задержка отключения звука поп-ах RET конец ENDP основные
user2338150
0

голосов
0

ответ
4

Просмотры

How to associate a Unit Test with respective function in CppUnitTestFramework

Хорошо, это может показаться слишком простым, но, как вы получите конкретный тест / тест-наборы, чтобы показать, как юнит-тесты для определенной функции, например, когда вы вызываете то же самое с правой кнопкой мыши внутри тела функции? (Run Tests вариант) я могу получить мои тесты, чтобы показать внутри «Все тесты» в Test Explorer, и также может запустить их, но внутри этой опции меню, я всегда получаю 'тестов не найдено для запуска. Вот мой unittests.cpp для справки: #include "CppUnitTestLogger.h" #include "CppUnitTest.h" #include "CalculationObj.h" с использованием пространства имен Microsoft :: VisualStudio :: CppUnitTestFramework; пространства имен UnitTests {TEST_CLASS (CCalculationObjTest) {общественность: BEGIN_TEST_METHOD_ATTRIBUTE (TestMethod1) TEST_OWNER (L "имя_владелец" ) TEST_PRIORITY (1) END_TEST_METHOD_ATTRIBUTE () TEST_METHOD (CCalculationObj_AdditionTest) {Int N1 = 100, n2 = 200; INT nOutPut = 0; попробуйте {CCalculationObj calcObj; calcObj.Addition (n1, n2, & nOutPut); Утверждают :: AreEqual (nOutPut, 300); } Задвижка (Const станд :: исключением & е) {Logger :: WriteMessage (e.what ()); }}}; } Я использую VS2015, и я заинтересован только Native Unit Tests Framework. Спасибо! п2, & nOutPut); Утверждают :: AreEqual (nOutPut, 300); } Задвижка (Const станд :: исключением & е) {Logger :: WriteMessage (e.what ()); }}}; } Я использую VS2015, и я заинтересован только Native Unit Tests Framework. Спасибо! п2, & nOutPut); Утверждают :: AreEqual (nOutPut, 300); } Задвижка (Const станд :: исключением & е) {Logger :: WriteMessage (e.what ()); }}}; } Я использую VS2015, и я заинтересован только Native Unit Tests Framework. Спасибо!
user2338150