В сборке 1374 ИСПРАВЛЕНО!
Да, я с удивлением обнаружил, что стандартный System.Predicate имеет только один обобщённый параметр
Меня так вообще жаба душит: я не понимаю, где это может все понадобиться! )))))
var less: Predicate2<real,real> := (x,y) -> x<y;
Sort(a,less);
Вызвало ассоциацию:
var a:=2;
var b:=2;
var c:=1;
Writeln(a+b-c);
Хотя, если это less многократно, есть о чем задуматься, информативно!
Тут дело не в конкретном примере, а в том, что предикаты с двумя параметрами очень распространены. Например, это любые операции отношения. Вы можете написать лямбду в параметр, но это не поменяет того, что этот параметр будет типа Predicate2. Вы ж говорите про жабу, а я говорю, что жабы нет.
Так лямбда - она лямбда и есть, на лету пишется, как однократная. А если предопределить предикат из лямбды - это уже что-то такое… Больше напоминает заглядывание во внутреннюю кухню.
Можно ли в задаче о сдаче эффективно (с точки зрения записи программы) избавится от цикла?
begin
var k:=Arr(1000,100,50,10); // массив с достоинствами купюр
var s:=ReadInteger('Введите сумму:'); // сумма к оплате
Writeln('Уплатить:');
var i:=0;
while s>0 do begin
var p:=s div k[i];
if p>0 then Writeln(p,' шт. достоинством ',k[i],' руб.');
s:=s mod k[i]; i+=1
end;
end.
Можно, но получится не сильно короче, хотя избавиться от индексов (i
) это всегда хорошо.
begin
var k:=Arr(1000,100,50,10); // массив с достоинствами купюр
var s:= ReadInteger('Введите сумму:'); // сумма к оплате
Writeln('Уплатить:');
k.Aggregate(s, (t, n) ->
begin
var p := t div n;
if p > 0 then Writeln(p,' шт. достоинством ',n,' руб.');
result := t mod n;
end);
end.
Ну до такой свёртки додуматься - это вообще нечто…"
Ничего особенного, если изучить свёртки в языке, созданном для такого стиля программирования (например, Haskell).
function GetNFiles(parth:string):array of string;
var
pfi:array of FileInfo;
pi:FileInfo;
i:integer;
s:array of string;
begin
var a:=new DirectoryInfo(parth);
pfi:=a.GetFiles();
i:=-1;
repeat
if High(pfi)<> -1 then
begin
i+=1;
pi:=pfi[i];
s[i]:= pi.Name; \\Выдает ошибку System.NillReferenceExpection
Result:=s;
end;
until i = High(pfi);
end;
Помогите разобраться с ошибкой в коде указанном выше, проблемная строка прокомментированна! Заранее спасибо!
Нужно выделить память для вашего динамического массива. Это можно сделать с помощью процедуры SetLength
:
SetLength(s, pfi.Length);
Спасибо большое!Впредь буду знать!
А может так:
begin
EnumerateFiles('.').Println(NewLine)
end.
?
Создается дочерняя форма form2:=unit2.form1.create; form2.owner:=self;
как в коде дочерней формы form2 обратиться к методам описанным мной в родительской форме owner? получается обращаться только к стандартным, реализованным в классе form (show,hide.close…)
Преобразуйте ее к типу form1:
var ff := form2.owner as ТипForm1
Создается дочерняя форма form2:=unit2.form1.create; form2.owner:=self;
как в коде дочерней формы form2 обратиться к методам описанным мной в родительской форме owner? получается обращаться только к стандартным, реализованным в классе form (show,hide.close…)
Создается дочерняя форма form2:=unit2.form1.create; form2.owner:=self;
как в коде дочерней формы form2 обратиться к методам описанным мной в родительской форме owner? получается обращаться только к стандартным, реализованным в классе form (show,hide.close…)