Если у меня в программе используется много оперативной памяти, а в какой-то момент она уже не будет нужна, как её освободить? Кроме того, возможно ли сделать так, что программа “забудет”, что некоторая переменная была инициализирована (при выполнении var), и можно будет инициализировать переменную с новым типом, но с тем же названием?
Почему ss.SpeakAsync читает строку, находящуюся только до ss.Speak, а если ss.Speak не существует в коде, то ss.SpeakAsync вообще не работает?
uses System.Speech.Synthesis;
{$reference System.Speech.dll}
begin
var ss: SpeechSynthesizer := new SpeechSynthesizer;
ss.SpeakStarted += (o,e)->Writeln('Начало.');
ss.SpeakProgress += (o,e)->Writeln('Продолжение.');
ss.SpeakCompleted += (o,e)->Writeln('Конец.');
ss.SpeakAsync('Начальное предложение не читается, если ничего не читается синхронно позже.');
//ss.Speak('Второе предложение читается всегда, когда выполняется соответствующая строка.');
ss.SpeakAsync('Конечное предложение не читается, если ничего не читается синхронно позже, то есть вообще не читается.');
end.
А сборщик мусора на что? Откройте справку данного паскаля и внимательно перечитайте первую страницу.
Сборщик мусора сам удаляет все объекты, когда считает что они уже не нужны. А локальные переменные, которые нигде больше не сохранили, удаляются прямо при выходе из подпрограммы:
type
t1 = class
// Этот метод вызывается прямо перед удалением объекта
protected procedure Finalize; override :=
Writeln('Finalize');
end;
begin
var a := new t1;
Writeln(a);
end.
Достаточно чтоб переменная вышла из зоны видимости:
uses System.Speech.Synthesis;
{$reference System.Speech.dll}
begin
begin
var ss: SpeechSynthesizer := new SpeechSynthesizer;
ss.SpeakStarted += (o,e)->exit();
ss.Speak('abc');
end;
//Ошибка: Неизвестное имя, потому что тут ss уже не существует
ss.Speak('def');
end.
После этого можно объявлять и новую переменную, даже с таким же именем.
Ну, вы же понимаете что значит Async? Оно успешно вызывается, но программа продолжает выполняться не ожидая окончания воспроизведения. И, в итоге, завершается до того как ss успеет начать говорить.
Для такие тестовых программ - всегда добавляйте что то типа Readln в конце программы. А в более сложных придётся думать по случаю.
Есть ли стандартная подпрограмма для вычисления корня n-ной степени? Если нет, то что лучше для вычисления: sign(x)*exp(ln(abs(x))/n), Sign(x)*Power(Abs(x),1/n), или что-то ещё?
чтобы присвоить результат деления переменной типа integer, но выходит ошибка “Невозможно явно преобразовать тип real к типу integer”. Как мне доказать, что получится integer?
.
Точнее через System.Convert. Это паскалевские Round, Ceil и т.п. сразу конвертируют результат округления в integer. Но сами операции округления на уровне процессора реализованы только для чисел с плавающей запятой. А конвертирование в целые для процессора отдельная операция.
Я хочу сделать так, чтобы можно было менять цвет текста консоли во время ввода значений с клавиатуры, но для этого нужны горячие клавиши, то есть обработка нажатий на клавиши.
То есть вы хотите чтоб, к примеру, вы могли вводить значение с помощью ReadInteger, но когда пользователь держит Ctrl - введённые цифры этого числа становились красными? Или как?
Попробуйте, лучше, объяснить свою ситуацию, то есть для какой задачи вам это нужно, а не как вы думаете это можно реализовать.
При нажатии определённой клавиши следующий символ не отображается, а следующая нажатая клавиша определяет цвет текста: “Y” — текст дальше вводится жёлтым, “B” — синим и т. д.
Можно присвоить экземпляр своего класса переменной CurrentIOSystem, если вы используете паскалевские подпрограммы чтения (как ReadInteger), или передать в Console.SetIn, если вы используется .Net-овские средства, как Console.ReadLine.
При этом в обоих случаях использовать старые CurrentIOSystem/Console.In соответственно в своём класса, чтоб выполнять собственно чтение, но при этом поверх добавлять свои проверки, чтоб при нажатии некоторых клавиш переключался цвет текста.
Но это всё сложно и долго, в простых случаях, всё же, лучше использовать Console.ReadKey.
Существует ли готовое решение, чтобы преодолеть проблему нехватки места в окне консоли при одновременном выводе больших строк (если текста слишком много, текст выше уходит за верх и пропадает), например, вывод сообщения “Для продолжения нажмите любую клавишу . . .” вместо текста в зависимости от размера части, которую необходимо вывести далее?
Текст сначала уходит из окна консоли (у которого Console.WindowHeight строк), но остаётся в буфере (то есть можно прокрутить скролбар чтоб вернуть ту часть текста в видимость).
А полностью пропадает текст только если заполнено Console.BufferHeight строк.
И то и то настраивается в настройках самой консоли. Но если вы хотите сделать что то программно - вы всегда можете переставлять курсор как вам угодно.
Почему некоторые символы в скомпилированной программе отличаются от этих же символов в окне вывода ИСP, например, “∈” превращается в “?”? Как это предотвратить?
Давайте вы всё же сами покопаетесь в настройках консоли, перед тем как задавать кучу вопросов.
Чтоб буква выводилась - нужно чтоб был шрифт, который описывает как её вывести. А он настраивается в консоли и никак к паскалю не относится.
Почему в паскале нет стандартной подпрограммы для вычисления корня? Предлагаю её добавить.
Я запутался в видах чисел, поэтому прошу решить, как лучше реализовать подпрограмму вычисления корня любого числа любой степени. Насколько я понял, в паскале возможно вычислить корень в области комплексных чисел, ведь так? Тогда как следует изменить или даже разделить на несколько представленную ниже подпрограмму, чтобы её результатом выполнения был корень в конкретной области чисел (комплексных, действительных и т. д.)?
///Корень степени n из x.
function Rt(x, n: real): real;
begin
if (n <= 0) then raise new System.ArgumentOutOfRangeException('Степень корня должна быть положительной.'); // Стоит ли это вводить, ведь 2**(-1) = 0.5
if (x < 0) then // if not (Int(n)=n) then else // Что делать, если число отрицательное, а степерь вещественная, ведь в таком случае y**n = NaN
if (Int(n) = n) and (Trunc(n) mod 2 = 0) then raise new System.ArgumentException('Корень чётной степени из отрицательного числа не существует в области вещественных чисел.'); // А вдруг нужен корень в области комплексных чисел?
Result := Sign(x) * Abs(x) ** (1 / n);
end;