Не заметил, в какой момент, но теперь по умолчанию стал браться логарифм для комплексного аргумента, а для вещественного надо писать System.Math.Log(). Это большая неприятность, потому что во всех ранее написанных программах функция стала возвращать комплексный результат. Как следствие - что-то перестало компилироваться, что-то - начало выдавать результаты в виде кортежа.
Да уж…(((
Это я после работы с Экселем с ума начал сходить, там log(), как и в Бейсике.
Перевел задачу с макросами на Паскаль, и логарифмы оставил. А в результате что ни пытаюсь компилировать - везде ошибки лезут с комплексом. Уже полез в справку .NET - а там тоже log в библиотеке Math.
Вот и запаниковал. В Паскале ведь Log() для комплексных, LogN() для заданного основания…
Я думаю, что это - моя вина. Ln пришло из Delphi, реализуется оно как Math.Log. В Delphi не было Complex, Complex.Log было просто вынесено в стандартный Log. Так и получилось. Предложение - либо переименовать комплексный Log в Ln либо сделать Log и Ln синонимами для всех типов, которые их реализуют.
Синонимы - это было бы отличное решение. Универсальное и в то же время сахарок. Переименовать комплексный Log по-моему хуже, хоть и проще: все же не все пока что можно получить из Справки и приходится временами “нырять” на сайт Microsoft за разъяснениями по библиотекам .NET. А там LOG.
При нажатии мышкой на внутреннею область квадрата происходит ошибка.
Из-за чего она возникает:“Program8.pas(6) : Ошибка времени выполнения: Поток не выполняется; его нельзя приостановить.”?
[details=Summary]uses graphabc;
var
a: real;
procedure md(x, y, z: integer);
begin
if (x > 100) and (x < 200) and (y > 100) and (y < 200) then readln(a);
end;
begin
onmousedown := md;
rectangle(100, 100, 200, 200);
end.[/details]
@admin Хорошая идея с кортежным вводом, но хотелось бы, чтобы и тут работал prompt:
var (x, y, z) := ReadlnInteger3('Введите X Y Z = ');
Кстати, как насчет добавить сразу и универсальный вариант ReadlnIntegerN()? И поправьте, пож., лишние пробелы при автоформатировании: var ( x , y , z ).
у кортежей максимум 7 элементов(не оч удобно, но ибо нефиг кортежи для серьёзных проектов юзать)
ReadlnIntegerN не будет работать потому что (integer,integer) и (integer,integer,integer) это разные типы и общи материский тип - System.Tuple, но и к нему преобразовать не получится
Program1.pas(5) : Невозможно явно преобразовать тип Tuple<integer,integer> к типу System.Tuple
лучше используйте массивы
function ReadlnInteger(N: cardinal): array of integer;
begin
Result := new integer[N];
if N <> 0 then
for i: cardinal := 0 to N - 1 do
Result[i] := ReadlnInteger;
end;
да и писать под каждое количество от 2 до 7 элементов(ReadlnInteger3) бесполезно, только займёт место в PABCSystem, нпмного проще так:
var (x,y,z) := (ReadlnInteger('Введите X Y Z = '),ReadlnInteger,ReadlnInteger)
Наверное, потому что не всем и не всегда нужен массив в итоге? В некоторых случаях удобнее и нагляднее работать с мнемоническими переменными, а не абстрактными индексами.
Я всё-таки ограничусь ReadInteger2 и ReadInteger3. Приглашение к вводу сделаю.
ReadlnIntegerN - какой-то совсем неправильный. На этапе выполнения невозможно задать тип (integer,integer) или (integer,integer,integer) в зависимости от n
А также ReadReal2 и ReadReal3? Очень полезно для ввода размеров двух- и трехмерных массивов, пар и троек координат точек, габаритных размеров, а также тройки параметров в циклах “от a до b с шагом h”.
Но все равно, очень жаль, что это не решит проблемы виртовского ограничения на шаг 1 (-1) в цикле, из-за которого приходится городить вот такие несуразицы для простейшей табуляции:
begin
var (a,h,n):=(ReadReal,ReadReal,ReadInteger);
foreach var x in n.Times.Select(i->a+i*h) do Writeln(x:7:3,x*x+0.2:9:3)
end.