Разное

Что значит в паскале readkey: Функция ReadKey.

Пора заменить Python как язык для обучения / Хабр

В последние десять лет мой стандартный ответ на вопрос «с какого языка начинать знакомство с программированием?» был прост — Python. Теперь я меняю свою рекомендацию. Python все еще хороший язык. Он позволяет сфокусироваться на задаче и не волноваться об архитектурных заморочках. О штуках, которые опытные программисты считают важными, позабыв о том, каково это — быть абсолютным новичком. Сам язык растворяется на фоне, и вместо объяснения возможностей и философий, уроки посвящены генерации музыкальных звукорядов, вычислению расстояний на стадионе в зависимости от беговой дорожки, или написанию автоматического игрока в покер или ятцы.

И вот в один прекрасный день студент задаст невинный вопрос: «А как сделать так, чтобы симулятор покера был не в командной строке, а в окне, с кнопкой для выдачи следующих карт?»

Сложно описать сложность этого вопроса. Он заставляет рассматривать различные GUI-инструменты для Python.

Оказывается, Гвидо делает то же самое каждые пару лет: задумывается, является ли TkInter правильным выбором для IDLE, стандартного IDE для Python. Но пока это TkInter.

Спустя неделю — новый вопрос: «Как написать простую игру, с графикой?»

Пора снова изучить варианты. Pyglet выглядит многообещающе, но он не обновлялся с июля 2012 года. Есть библиотеки, которые фокусируются на чем-то конкретном и не пытаются делать все подряд, например, SplatGL, но она довольно новая и сложно найти достаточное количество примеров. PyGame вроде как популярен, есть даже книга, так что окей, давайте учиться как использовать PyGame.

Спустя месяц новые вопросы: «Как я могу поделиться своей игрой с другом? Хотя… можно ли закачать эту игру на телефон, чтобы показать всем, и чтобы им не нужно было ничего устанавливать?»

Эмм…

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

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

Рост популярности не-десктопов все усложняет, да. Я изучал Erlang чтобы уйти от С и С++ и изменить свой уровень мышления. Я доказал, что могу использовать Erlang и чисто функциональный подход в той сфере, которую все больше всего боятся: игры. А потом вышел Айфон и все. Erlang’у больше нет места.

Именно из-за этих мыслей и опыта теперь я рекомендую JavaScript в качестве языка для обучения. Я знаю, знаю, он причудливый и иногда просто странный, но в целом это нормальный и достаточно современный язык. Самое главное, он работает на беспрецедентно повсеместной кросс-платформенной системе для разметки, типографики и рендера. Хочешь показывать элементы интерфейса, изображения или текст? Используй HTML напрямую. Хочешь графику и анимацию? Используй canvas.

Я ожидаю реакции многих на такое изменение мышления: ужас и страх. Эти реакции не должны быть связаны с недостатками JavaScript. Они должны быть связаны с тем, что я проигнорировал кучу других языков, не взирая на их возможности, системы типизации или синтаксис, просто потому что у них нет нативной поддержки в веб-браузерах.

Создайте свой текстовый редактор на Rust! Часть 2 | Кофи Отуо

В первой части этого руководства мы настроили наш проект и создали новый бинарный файл Rust под названием pound. Пока отображается только «Hello world!» в терминале. Давайте теперь попробуем прочитать нажатия клавиш пользователем.

Этот код содержит много информации, поэтому давайте рассмотрим его. Чтобы получить пользовательский ввод, нам нужно ввести в область видимости библиотеку io (ввод/вывод). Библиотека io взята из стандартной библиотеки ( станд. ). std::io::Read — это признак , который предоставляет метод .read . Функция stdin возвращает экземпляр std::io::Stdin , который является типом, представляющим дескриптор стандартного ввода для вашего терминала. Поскольку мы хотим читать по 1 байту за раз, мы передаем [0;1] функции read . Когда read() достигает конца файла , он возвращает 0.

Чтобы выйти из вышеуказанной программы, нажмите Ctrl-D, чтобы сказать read() достигнут конец файла. Или вы всегда можете нажать Ctrl-C, чтобы сигнализировать о немедленном завершении процесса.

Нажмите q для выхода ⚒

Давайте добавим новый способ выхода из программы.

Нажмите q для выхода

Теперь, чтобы выйти из программы, вам нужно ввести текст с буквой «q» и нажать Введите . Программа считывала каждую букву, сохраняла ее в переменной buf и затем проверяла, совпадает ли эта буква с q . Обратите внимание на [b'q'] . buf относится к типу [u8;1] и может сравниваться только с аналогичным типом. Префикс b предоставляет байтовый литерал, который эквивалентен u8 .

Вместо buf != [b'q'] в этом случае можно написать buf[0] != b'q' .

Канонический режим и режим Raw ⛓

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

Нам нужен необработанный режим , , который полностью противоположен каноническому режиму . К счастью, крейт crossterm предоставляет простой способ перевести терминал в необработанный режим. Напомним, что в первой части мы добавили кросстерм зависимость.

Поскольку мы используем крейт crossterm , нам не нужно самостоятельно вручную изменять атрибуты терминала.

Включить необработанный режим 🔓

Как уже упоминалось, функция включения необработанного режима находится в crossterm crate:

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

Отключить режим Raw 🔐

Может показаться, что добавление terminal::disable_raw_mode() в последнюю строку нашего кода может помочь, но это внесет ошибку в наш код. Давайте попробуем.

Теперь предположим, что функция после enable_raw_made() выдает ошибку и паникует, disable_raw_mode() не будет вызываться и терминал останется в режиме raw . Попробуйте, поместив panic!("Произошла ошибка") в любом месте после terminal::enable_raw_mode() . Чтобы исправить это, давайте создадим структуру с именем CleanUp :

. Давайте разберем ее. Мы создали новую структуру CleanUp и реализовали для нее Drop. Сейчас drop() вызывается в таких случаях, когда экземпляр структуры (в нашем случае переменная _clean_up ) обычно выходит за пределы области видимости (в данном случае, когда main() возвращает ) или когда есть panic , пока экземпляр все еще находится в области действия. Запустите программу и наблюдайте разницу по сравнению с ошибкой

Строка panic!() может быть добавлена ​​в любом месте после строки terminal::enable::raw_mode() , чтобы наблюдать аналогичные эффекты

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

Возможно, вы также заметили, что Ctrl+D и Ctrl+C не завершают программу снова. Только q завершает программу. Давайте посмотрим, что происходит под капотом

Отображение нажатий клавиш 📟

Измените код:

.is_control() проверяет, является ли символ управляющим. Управляющие символы — это непечатаемые символы, которые мы не хотим выводить на экран. Все коды ASCII 0–31 являются управляющими символами, а 127 также является управляющим символом. Все коды ASCII 32–126 можно распечатать. (Проверьте таблицу ASCII, чтобы увидеть все символы)

Обратите внимание, что мы используем println!() с \r в качестве последнего аргумента. Это потому, что мы включили необработанный режим. Удалите \r вот так и обратите внимание на разницу:

Используя println!() без \r , вы увидите, что символы новой строки, которые мы печатаем, перемещают курсор только вниз, а не влево сторона экрана. Это постоянно перемещает вывод вправо. \r перемещает курсор обратно в левую часть экрана.

Теперь пришло время попробовать нашу программу и открыть для себя кое-что. Запустите программу и попробуйте клавиши, такие как клавиши со стрелками, или Escape , или Page Up , или Page Down , или Home , или End , или Backspace , или Delete , или Введите . Попробуйте комбинации клавиш с Ctrl, такие как Ctrl-A, Ctrl-B и т. д.

Вы заметите несколько интересных вещей:

  • Клавиши со стрелками, Page Up, Page Down, Home и End all input 3 или 4 байта до терминала: 27 , '[' , а затем один или два других символа. Это известно как управляющая последовательность . Все управляющие последовательности начинаются с 27 байт. Нажатие Escape отправляет на вход один байт 27 .
  • Backspace — это байт 127 . Удалить — это 4-байтовая управляющая последовательность.
  • Введите либо байт 10 , символ новой строки, также известный как '\n' , либо байт 13 , символ возврата каретки, также известный как \r .
  • Ctrl-A — это 1 , Ctrl-B — это 2 , Ctrl-C — это… о, это завершает программу, верно. Но комбинации клавиш Ctrl, которые действительно работают, похоже, сопоставляют буквы A–Z с кодами 1–26

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

Миграция проекта для использования crossterm 🦾

Может быть сложно помнить обо всех различных ключах и соответствующих им байтовых литералах. Вы можете продолжать ссылаться, но это может занять много времени. crossterm crate также обеспечивает абстракцию различных ключевых событий, поэтому нам не нужно помнить, что Arrow Up сопоставляется с 27[A и так далее.

Давайте воспользуемся возможностями crossterm :

Перенос проекта на crossterm

Вот это уже много. Давайте попробуем обдумать это. loop { .. } работает аналогично while() . Мы перенесли наше условие из функции while и поместили его в цикл 9.0008, чтобы сделать его более читабельным. Мы используем crossterm::event::read() вместо стандартного std::io::read() . Это упрощает интерпретацию событий с терминала. event::read() возвращает событие Event , которое является перечислением . Поскольку нас сейчас интересуют только нажатия клавиш, мы проверяем, является ли возвращенное событие Event Key . Затем мы проверяем, является ли нажатая клавиша q . Если пользователь нажал q , мы выходим из цикла и программа завершается.

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

Тайм-аут для

read()

В настоящее время read() будет бесконечно ждать ввода с клавиатуры перед возвратом. Что, если мы хотим сделать что-то вроде анимации на экране, ожидая ввода пользователя? Или что, если мы хотим завершить программу после некоторого времени бездействия? Мы можем установить тайм-аут, чтобы read() возвращает значение, если в течение определенного времени не поступает никаких данных. Мы будем использовать функцию crossterm::event::poll вместе с read :

Read timeout

event::poll проверяет, доступно ли событие Event в течение заданного времени. Поиграйте с заданным временем. Если Событие не доступно в течение заданного времени, poll возвращает false .

Обработка ошибок 🚫

Поскольку мы закончили перенос нашего проекта на использование crossterm , давайте обработаем возможные ошибки. До сих пор мы использовали .expect(" .. ") . Необходимость писать .expect() каждый раз может утомлять. Давайте воспользуемся сокращением, предоставленным Rust. Давайте изменим нашу функцию main() следующим образом:

Обработка ошибок

? Оператор можно использовать только в методе, который возвращает Result или Option , поэтому нам нужно изменить наш main() , чтобы он возвращал Result . crossterm::Result можно расширить до std::result::Result . Таким образом, для нашей функции main() возвращаемый тип может быть преобразован в std::result::Result<(), std::io::Error> . Возьмем, к примеру, функцию poll . Он возвращает std::result::Result . Поскольку второй аргумент в Результат возвращен опросом (т.е. std::io::Error ) того же типа, что и Result , возвращаемый main() , мы можем использовать ? Оператор в функции poll в методе main() .

Давайте завершим эту часть урока быстрым обзором того, что мы сделали. Сначала мы считываем нажатия клавиш, затем модифицируем программу так, чтобы она завершалась при нажатии q . Затем мы включили необработанный режим (что позволило нам увидеть, как различные ключи, такие как Home , преобразуются в байты) , а также нашел способ правильно отключить необработанный режим при выходе из нашей программы. Мы также интегрировали crossterm в наш проект. Наконец, мы изменили способ обработки ошибок.

В следующей части мы сделаем более низкоуровневую обработку ввода и вывода терминала и используем ее для рисования на экране и предоставления пользователю возможности перемещать курсор!

Если вам нужно больше примеров кода Rust, вот рекомендуемый

Rust Cookbook и Учебник вы должны попробовать!

Виртуальный Паскаль | eCSoft/2

Virtual Pascal v2. 1 Beta Build 279 Лондон, май 2004 г. (С) Copyright 2004 vpascal.com Этот файл предназначен для того, чтобы дать обзор того, что изменилось между Virtual Pascal v2.1 Beta build 243/270/274 и эта сборка. Упоминаются как исправления ошибок, так и новые функции. Где ошибка новой функции присвоен номер ссылки, номер ссылки также упоминается. Большинство изменений упоминается в этом документе. Для более подробного описания каждой проблемы, обратитесь к базе данных ошибок VP, которую можно найти по адресу http://www.vpascal.com/bugs. Исправлены ошибки в сборке 277 ---------------------- [98] Разные проблемы с SysCmdLn в Windows. [107] Readkey не получает весь вставленный текст. [108] Ряд проблем с вводом символов в Windows, включая использование AltGr/право-Alt [110] Ошибка в выравнивании записей в ShellApi.pas. [111] Ошибка в диалоговом окне открытия Turbo Vision (stddlg.

pas). [125] HeapChk.pas работал некорректно. [134] Файлы, созданные в Linux, всегда имеют атрибут Executable. [147] WinDos.GetEnvVar всегда возвращал мусор в Windows. Исправлены ошибки в сборке 274 ---------------------- [42] Исправлено определение API DeviceCapabilities в win32.def. Он был внесен в список как API в winspool.dll — на самом деле он существует в winspool.drv. [43] В Win32 использовались несколько функций преобразования кодовых страниц Ansi/Oem. для обработки перевода набора символов для консольных приложений. Теперь это были удалены, поэтому внутренние компоненты VpSysW32 используют строки кодовой страницы OEM путем по умолчанию при использовании в консольном приложении. В результате имена файлов с символы high-ascii в имени должны работать лучше, чем раньше. [74] IDE и компилятор теперь загружают локализованный строковый файл, если он доступен.
Если переменная среды LANG содержит код языка и страну код, только код языка используется для идентификации используемого строкового файла. [79] В сборке 270 в функцию удаления было добавлено «исправление», позволяющее сделать что-то для значений Index <= 0. Это было изменено на совместим с Turbo Pascal и Delphi, где индекс <= 0 означает подпрограмму ничего не делает. [87] Функция Windos.FileSplit не обрабатывала файлы с более чем одним "точка" в названии. [94] В Linux не все исключения ОС корректно сопоставлялись с языком. исключения, вызывающие сбой по крайней мере одного из тестовых случаев. [98] Функция SysCmdLn не возвращала задокументированную строку в Win32. В частности, части программы и аргумента возвращаемого значения были разделенные пробелом, а не # 0, как это должно быть. [99] В Win32 функции окружения вызывали утечку памяти, потому что API FreeEnvironmentStrings не вызывался. Добавлена ​​новая процедура в VpSysLow, SysFreeEnvironment, который следует вызывать для освобождения результата Вызов SysGetEnvironment.
[101] IDE OS/2 PM будет передавать и использовать 100% ЦП. Это было вызвано два отдельных набора кода, пытающихся обработать динамическое изменение размера окна. [103] Если исходный файл был открыт путем ввода имени файла в поле Открыть диалоговое окно, а затем сохраняется, регистр имени файла изменится на тот, который был введен. Это было исправлено, поэтому IDE принимает регистр имени файла на диске. [106] Среда Linux IDE не могла перейти к каталогам менее двух уровней. глубокий. Это было вызвано ошибкой в ​​Linux-версии FindFirst. [na] Обновлены тестовые случаи, чтобы включить тесты для функций обработки командной строки. и сопоставление исключений между ОС и языком. [na] Исправлена ​​проблема, из-за которой компоновщик иногда жаловался на отсутствие точка входа в модуле Strings (только для Win32). [na] Реализовано SysCtrlGetModuleName для Index = 0 в Linux. [na] В Math.
pas добавлен {&Delphi+}; это требуется. Ниже приведен список нововведений в VP v2.1 Build 270: Новые функции и улучшения ----------------------------- * Новые интерфейсные единицы Windows API [77] Добавлен файл opengl.pas, реализующий интерфейс API OpenGL. Этот модуль также может работать в OS/2, хотя он и не тестировался. [71] Добавлен commctrl.pas, реализующий интерфейсы API для Windows. Общие элементы управления. [71] Добавлен mmsystem.pas, реализующий интерфейс для Windows Multi. Медиа API. [15] Новый модуль (wincrypt.pas), реализующий интерфейс к Windows Crypto API добавлен в source\w32. * Новые примеры [77] Добавлено три новых примера OpenGL, которые можно найти в каталог \examples\w32\opengl.
Общая структура для примеров можно найти в общем подкаталоге. Примеры изначально написаны Яном Хорном. [35] Добавлен тестовый фреймворк, подходящий для тестирования VP RTL и компилятор. Код тестовой среды можно найти в \examples\тестирует и компилирует для всех платформ. (Обратите внимание, что есть пока не очень много тестов - пожалуйста, сделайте несколько! 🙂 [13] Для желающих включен пример базового графического интерфейса Win32. для такого программирования. Пример можно найти в \примеры\w32\gui\hello.pas [na] Пример Touch был расширен, чтобы быть полезным: он позволяет файлам в подкаталогах, которые нужно трогать, и можно сказать игнорировать заблокированные файлы. * Усовершенствования библиотеки времени выполнения [na] Все новые функции задокументированы в интерактивной справке, доступной из среды IDE. [82] Добавлены функции для получения и установки управляющего слова FPU в математический блок.
[78] Несколько функций в модуле «Математика» были обновлены. точные (константы Min* и Max*, функции Tan, CoTan и ArcTanh), и добавлено несколько новых функций: - SinCosD и SinCosS для двойных и одиночных аргументов - Новые триггерные функции (Hav, ArcHav, Vers, CoVers, Chord, Secant, CoSecant) - Новые гиперболические функции (Sech, CoSech, CoTanh, ArcCoTanh, rcSech, ArcCosech) - Функция кубического корня Cuberoot - Значительно более быстрая процедура IntPower [56] Функция Exp в системном блоке была сделана максимально точной. возможно, для облегчения сложных математических задач. предыдущий был гораздо менее точен и провалил несколько новых тестов для Exp. [55] Несколько функций в системном блоке были ускорены за счет используя инструкции, которые могут быть конвейеризированы на современных процессорах. я сделал то же самое для нескольких функций PChar в модуле Strings, и код теперь немного больше и в 2-4 раза быстрее, чем раньше.
[33] Object Professional добавлен в программу установки с полной исходный код в результате того, что TurboPower выпустила его как открытый исходный код. [28] Добавлена ​​поддержка дисков > 2 ГБ в SysDiskFreeLong и SysDiskSizeLong функционирует в VpSysLow. [26] В VpSysLow добавлена ​​отсутствующая функция ResetSemaphore. [na] Модули интерфейса Linux (Linux.pas, VpSysLnx и т. д.) были значительно расширен. [na] В RTL добавлена ​​поддержка 32-битной DOS (DPMI32). новые модули VpSysD32.pas и VpUsrD32.pas реализуют эту функциональность. Примечание: чтобы использовать это, вам нужно определить пользовательскую цель компилятора в IDE и иметь совместимый расширитель DOS для запуска программ. [na] В Os2Base.pas добавлены функции блокировки файлов. Жук в определении DosFSCtl API исправлено. [na] Добавлена ​​новая единица для 64-битных вычислений с использованием типа Comp. добавлен как int64.pas. [na] Новый модуль для различных строковых функций, которые никуда не подходят добавлено еще: vpstring.pas * Улучшения IDE Включена экспериментальная Linux IDE. Эта IDE умеет делать все, что вы можете делать в Windows или OS/2, кроме отладки. Отладчик пока не работает; если повезет, это будет скоро. Обратите внимание, что Ctrl-, Shift- и Alt-клавиши могут работать странно при работе на нелокальном терминале (таком как telnet или ssh). [74] IDE теперь автоматически загружает локализованный строковый файл, если он существует. Если нет, по умолчанию используется английский файл vp.str. Чтобы определить, какой файл загрузить, VP ищет среду VPLOCALE. переменная. Если это найдено, он ищет файл с именем 'vp-.str' в общем каталоге и использует его, если он найден. Если VPLOCALE не определен или файл не существует, VP использует переменная окружения LANG для той же цели. Включен файл на немецком языке (vp-de.str) для IDE. [69] При использовании точки журнала в отладчике (т. е. точки останова, не ломается, а вместо этого записывает что-то в окно журнала), TID текущий поток также добавляется. Это значительно облегчает отслеживайте труднодоступные проблемы с потоками, такие как [20]. [38] IDE теперь автоматически определяет текстовые файлы UNIX. Это работает, проверяя символ перед первым номером 10 в файле - если это номер 13, то он это файл DOS, в противном случае это файл UNIX. [36] Диалоговое окно открытия IDE теперь принимает несколько подстановочных знаков. Это позволяет стандартный для открытия файлов pas, inc, dpr и pp, что удобно при просмотре различных типов исходных файлов Pascal. [11] Сборка VP теперь содержит больше информации о себе в разделе «О программе». Коробка с указанием даты и места сборки. * Усовершенствования компилятора [91] Компилятор теперь неявно добавляет каталог основного файла до конца пути поиска. Это позволяет использовать примеры и другой код. быть скомпилирован (даже если для компиляции требуется несколько файлов) без изменения текущего каталога. [72] Тип Real теперь определяется как идентичный 8-байтовому типу. Double, а медленный 6-байтовый тип Real называется Real48. Если вам нужно хранить Reals в файле, который используется совместно с Turbo Pascal, используйте Real48 - все остальные могут использовать новый Real, который намного быстрее. [50] Теперь компилятор распознает Linux как стандартную цель. Использовать эту цель, используйте /CL в командной строке. (Обратите внимание, что поддержка Linux все еще является экспериментальным - это просто облегчает эксперименты 🙂 * Улучшения установщика Включен новый родной установщик для Linux, setuplnx. Оно работает точно так же, как установщики Windows и OS/2, за некоторыми исключениями: - Диалог выбора диска не отображается - Диалог "кейс" не показывается; все установлено в нижнем регистре - Механизм исправления не работает, так как он использует исполняемый файл Dos. [61] Программа установки была изменена, чтобы запретить пользовательский выбор пакеты, за исключением случаев, когда выбрана «Пользовательская установка». Слишком много пользователей выбрали «Все, что бесплатно», а затем включил небесплатные пакеты. Исправление ошибок --------- [нет] Использование SetLength(, N) с N < 0 приводило к непредсказуемым результатам. Результаты. [92] В библиотеку импорта добавлено несколько новых функций Windows kernel32. [83] Функция SameText в SysUtils иногда могла искать дальше. чем должно было быть. [79] Процедура удаления работала некорректно для индекса < 0. [71] Обновлен файл Windows.pas с несколькими новыми константами, представленными в Windows XP. [68] Функция SysCtrlCreateThread в обработчиках просочившихся потоков VpSysLow в Windows. [63] Команда ExecDos в OpDos.pas не работала в OS/2. [58] Реализация SysFileUNCExpand в VpSysLow в OS/2 возвращена неверные значения для удаленных файловых систем вне локальной сети. [48] ​​Процедура поиска информации о местоположении во время выполнения (RTLI) в системе, GetLocationInfo, ошибка кода в библиотеках DLL. [46] Процедура Eoln не работала, если последовательность CR-LF была разделена на два разных буфера чтения. [42] API DeviceCapabilities (Windows) был определен неправильно. Когда вызывался API, приложение аварийно завершало работу. [40] Установщик теперь указывает место на диске в единицах СИ КиБ и МиБ. вместо неточно определенных КБ и МБ. Пожалуйста, обратитесь к этому статья, если вы запутались: http://physics.nist.gov/cuu/Units/binary.html [39] Функция SysGetDriveType в VpSysLow часто распознавала сетевые диски как разделы NTFS. [32] TWindowsObject.GetChildren (модуль OWL) не работал, если восстанавливаемое окно имело дочерние элементы из-за повреждения стека. [31] При динамической загрузке и выгрузке библиотек DLL код выхода для выгруженная (созданная VP) DLL закроет дескрипторы StdIn и StdOut в Окна. [30] В IDE (и других ТВ-приложениях) могло произойти повреждение экрана, когда режим экрана был переключен. [25] Когда ни одна клавиша не была нажата в Windows, значение SysShiftState было не обновляется. [22] ReAllocMem не заполняла вновь выделенную память нулями, поскольку указано в интерактивной справке. Это происходит сейчас. [20] Приложения, использующие много потоков, могли аварийно завершать работу в _GetTlsVar. рутины Системного блока. Это было исправлено, и скорость диспетчер кучи был увеличен в то же время. Также исправлена ​​проблема в коде поиска TLS при доступе к первой переменной TLS модуля. [18] В некоторых случаях значения «не число» (NaN) с плавающей запятой переменные отображались некорректно - иногда показывались как INF (бесконечный) вместо этого.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *