Чтобы отправить ответ, вы должны войти или зарегистрироваться
Функциональное системное программирование — вернем здравый смысл ИТ
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Канторовы системы → Delphi SDK для KolibriOS → Модуль CRT
Чтобы отправить ответ, вы должны войти или зарегистрироваться
procedure ConsoleInit(Title: PKolibriChar);
лучше сделать overload.
Значение $FFFFFFFF вот здесь
ConsoleInitProc($FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, Title);
означает — по умолчанию стандартный размер(80x25).
Вот из справки
void __stdcall con_init(dword wnd_width, dword wnd_height,
dword scr_width, dword scr_height, const char* title);
Инициализация консоли. Вызывается один раз в начале программы.
wnd_width, wnd_height - высота и ширина (в символах) видимой в окне консоли
области;
scr_width, scr_height - высота и ширина (в символах) всей консоли;
любые из первых 4 параметров могут быть установлены в -1 (=0xFFFFFFFF)
- использовать значения по умолчанию;
title - заголовок окна консоли.
Возможность менять размер бывает очень полезной.
Например, мне это пригодилось в программе CoffDump, под первым спойлером — стандартный размер, под вторым спойлером — увеличенный размер board.kolibrios.org/viewtopic.php?f=9&t=3577#p69106
Добавлено 2020-06-08 в 03:32
Раз уж беззнаковое 4-ёх байтовое имеет тип LongWord, то, думаю, для знаковых логичнее LongInt, а не Integer.
Добавлено 2020-06-08 в 03:40
kbhit — это KeyPressed, а не Escape
Добавлено 2020-06-08 в 03:44
pascal.net.ru/Procedures
wiki.freepascal.org/Crt
Добавлено 2020-06-08 в 03:48
Ну про Write писал уже там
А текущий вариант — потенциальный источник проблем
Добавлено 2020-06-08 в 04:07
WndWidth, WndHeight, ScrWidth, ScrHeight: LongInt
LongWord же, это ведь размеры, а не координаты!
Добавлено 2020-06-08 в 04:14
ошибки в TextBackground:
Light = #27'[1m';
#27'[37m' // LightGray
должно быть
Light = #27'[5m';
#27'[47m' // LightGray
Добавлено 2020-06-08 в 04:16
ошибки в TextColor
Light = #27'[5m';
должно быть
Light = #27'[1m';
Добавлено 2020-06-08 в 05:01
программа какую-то ерунду выводит при установке некоторых цветов
вот тут
DarkGray..White:
begin
Write(Colors[color]);
Write(Light);
end;
надо делать "Color-8"
DarkGray..White:
begin
Write(Colors[Color-8]);
Write(Light);
end;
НЕТ! Не надо ни каких overload версий! Лучше ОДНУ, НОРМАЛЬНУЮ:
procedure ConsoleInit(Title: PKolibriChar; WndWidth: LongInt = $FFFFFFFF; WndHeight: LongInt = $FFFFFFFF; ScrWidth: LongInt = $FFFFFFFF; ScrHeight: LongInt = $FFFFFFFF);
И var блоку процедур:
var
ConsoleExit: procedure(CloseWindow: Boolean); stdcall;
KeyPressed: function: Boolean;
ReadKey: function: KolibriChar; stdcall;
SetCursorHeight: function(Height: Integer): Integer; stdcall;
Write: function(const Text: PKolibriChar): LongInt; cdecl varargs;
WriteText: procedure(Text: PKolibriChar; Length: LongWord); stdcall;
НЕ МЕСТО в интерфейсной части модуля. Их лучше скрыть в implementation, что бы пользователь их не переопределил с дуру. Лучше сделать wrapper-ы этих процедур.
Добавлено 2020-06-08 в 17:39
Вот как выглядит модуль CRT в FreePascal. Думаю, "ванильный" Pascal, содержит тоже самое: https://wiki.freepascal.org/Crt
Желательно реализовать в Колибри как можно больше из того, что там есть. Что бы не переучивать пользователей. Ну и может что-то своё завести.
Модератор: тег надо оформлять тегом [ code ].
Я когда-то делал для Oberon-07 такой пример github.com/AntKrotov/oberon-07-compiler … arpet.ob07
Теперь решил переделать под Delphi, немного изменил его даже.
StrToInt - это часть модуля SysUtils
function Pow - вообще в Delphi есть функция Power, написана на ассемблере в модуле Math.
ReadString - заготовка для Read и ReadLn в модуль CRT.
Если так подумать, то правильный путь - возрождать оригинальные модули (или хотя бы их части). Как-то не очень хорошо, писать по второму разу то, что уже существует в Delphi.
Вот вам и простор для развития SDK. Если всё это дело правильно оформить - будет мощная вещь. SDK "из коробки" должна поставлять кучу возможностей. А иначе будим по 10 раз писать одни и те же вещи для разных примеров.
К стати на GitHUB до сих пор старые модули, хотя тут - их улучшенные версии с рабочими секциями инициализации и финализации.
Модератор: нужно пользоваться внутренней адресацией.
Выложил на GitHub версию с перегруженными Write/WriteLn, использующими открытый массив для вызова printf. Скопировал реализацию из CoreLite, где таким же образом вызывается wvsprintf, но что-то не работает. Все примеры, использующие эту функцию, выводят нечто похожее на мусор. На отладку времени нет. Прошу разобраться, если можно.
Вот это может работать не так, как ожидается
procedure Delay(Milliseconds: LongWord);
begin
Sleep(Milliseconds div 10);
end;
если Milliseconds < 10(после деления вообще 0 будет, но лигичнее сделать хотя бы 1).
Я в своём эмуляторе PELoad board.kolibrios.org/viewtopic.php?f=9&t=2318
перегруженными Write/WriteLn, использующими открытый массив для вызова printf. Скопировал реализацию из CoreLite, где таким же образом вызывается wvsprintf, но что-то не работает. Все примеры, использующие эту функцию, выводят нечто похожее на мусор.
Есть функция wvsprintf, а есть wsprintf, и это — не одно и тоже!
Функция printf из библиотеки Console похожа на wsprintf.
Добавлено 2020-06-09 в 14:20
Вот здесь github.com/vapaamies/SDK/blob/master/Ex … lloGUI.dpr на самом деле находится консольный пример, и не обязательно делать
uses
KolibriOS
достаточно CRT.
Вот как тут github.com/vapaamies/SDK/blob/master/Ex … /Hello.dpr
github.com/vapaamies/KolibriOS/commit/c … d2a6049c9e
-Write('%02x.%02x.%02x', Day, Month, Year);
-Write(' - %02x:%02x:%02x', Hours, Minutes, Seconds);
+Write('%02u.%02u.%02u', [Day, Month, Year]);
+Write(' - %02u:%02u:%02u', [Hours, Minutes, Seconds]);
и по-твоему оно теперь правильно работает?
Читаем справку по спецификаторам формата функции printf, например, где-нибудь тут www.cplusplus.com/reference/cstdio/printf
Что за мания "исправлять" работающий код!?
Добавлено 2020-06-09 в 15:06
Вместо
@@arg:
MOV EDI, [EDX + ECX * VarArgSize - VarArgSize]
PUSH EDI
LOOP @@arg
можно писать так
@@arg:
PUSH dword ptr [EDX + ECX * VarArgSize - VarArgSize]
LOOP @@arg
Тогда сохранять регистр edi(PUSH\POP) не требуется.
Почему, кстати, для сохранения esp используется ebx, а не ebp, как обычно? Хотя в данном случае, думаю, разницы большой нет.
если Milliseconds < 10(после деления вообще 0 будет, но лигичнее сделать хотя бы 1).
Если делать по-паскалевски, надо реализовать Round и использовать деление с плавающей запятой.
Я в 3 часа ночи писал, не разобрался.
+Write('%02u.%02u.%02u', [Day, Month, Year]); +Write(' - %02u:%02u:%02u', [Hours, Minutes, Seconds]);
...
Что за мания "исправлять" работающий код!?
Тоже издержки ночной работы. Стал экспериментировать и забыл откатить. Исправлю в коммите с работающей printf.
Почему, кстати, для сохранения esp используется ebx, а не ebp, как обычно?
EBP используется Delphi в прологах-эпилогах функций. Хотя надо смотреть подстрочник, может в этом случае и не используется... А, в CoreLite у функции есть третий параметр, так что используется. Или я чего-то не помню...
0CodErr пишет:если Milliseconds < 10(после деления вообще 0 будет, но лигичнее сделать хотя бы 1).
Если делать по-паскалевски, надо реализовать Round и использовать деление с плавающей запятой.
Это делается примерно так
(Number + (Divider div 2 )) div Divider
в нашем случае
Divider = 10
(Divider div 2 ) = 5
Привожу пример такого перевода миллисекунд в сотые доли секунды:
(20 + 5) div 10 = 2
(21 + 5) div 10 = 2
(22 + 5) div 10 = 2
(23 + 5) div 10 = 2
(24 + 5) div 10 = 2
(25 + 5) div 10 = 3
(26 + 5) div 10 = 3
(27 + 5) div 10 = 3
(28 + 5) div 10 = 3
(29 + 5) div 10 = 3
и никакой плавающей запятой не нужно!
▼Сам пример
А можно адаптировать StrToInt к ShortString? Начнем делать SysUtils. Наверное, лучше так:
function StrToInt(const Str: ShortString): LongInt;
Тогда можно будет добавить ReadLn и сам пример.
Сейчас просматривают: 1 гость, 0 пользователей
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Канторовы системы → Delphi SDK для KolibriOS → Модуль CRT
Форум работает на PunBB, при поддержке Informer Technologies, Inc