Разумеется, это можно потом прилепить к срезам. А пока что реализовать с запретом присвоения левой части.
Это надо начинать с одномерных срезов
Ну с этим я не спорю. но одномерные срезы - тоже срезы.
А там, глядишь, появится полноценный тернарный оператор, а не только выражение. Правда, не знаю, зачем он, но все равно занятно.
Это уже заявка будет на памятник при жизни. Ну хорошо, не памятник…бюстик у входа на кафедру.
Смотрю заголовок:
function CheckAndCorrectFromToAndCalcCountForSystemSlice(
situation: integer; Len: integer; var from, &to: integer; step: integer):
integer;
Возникает вопрос, каким должен быть набор параметров для матрицы. Все параметры задвоены будут? situarionRow, situationCol, LenRow, LenCol, … и что возвращать будем? Кортеж (integer, integer) ? Или просто будет еще какой-то модуль, вызывающий эту функцию дважды - для строки и столбца?
Не знаю. Это как Вы решите. Делайте попроще чтобы можно было разобраться. Навскидку - вызывать 2 раза по каждой размерности
Саму реализацию среза я написал. Как раз проблема вся в том, чтобы её вызывать с подготовленными параметрами, но вызов в компиляторе закамуфлирован. Можно только проследить, как идет вызов при обращении к расширению a.Slice( ), но не a[x:y:z].
Ниже - первая часть для заданных начала, шага и количества элементов в срезе. Она работает, посмотрите пожалуйста, можно ли ее встроить в таком виде или что-то надо править.
Summary
function CreateSliceFromArrayInternal<T>(Self:array[,] of T;
RowFrom, RowStep, &RowCount, ColFrom, ColStep, &ColCount : integer) :
array[,] of T;
begin
Result := new T[&RowCount,&ColCount];
var iRow := RowFrom;
for var i := 0 to &RowCount-1 do
begin
var jCol := ColFrom;
for var j := 0 to &ColCount-1 do
begin
Result[i,j] := Self[iRow,jCol];
jCol += ColStep
end;
iRow += RowStep
end
end;
procedure CorrectCountForSlice(Len, from, step: integer; var count: integer);
// ТУТ Я НЕ СМОГ ВЫЗВАТЬ ОДНОИМЕННУЮ ПРОЦЕДУРУ ИЗ PABCSYSTEM !!!
// А ИНАЧЕ ЭТА ПРОЦЕДУРА НЕ НУЖНА
begin
if step = 0 then
//raise new ArgumentException(GetTranslation(PARAMETER_STEP_MUST_BE_NOT_EQUAL_0));
begin
Writeln('PARAMETER_STEP_MUST_BE_NOT_EQUAL_0');
Exit
end;
if count < 0 then
//raise new ArgumentException(GetTranslation(PARAMETER_COUNT_MUST_BE_GREATER_0));
begin
Writeln('PARAMETER_COUNT_MUST_BE_GREATER_0');
Exit;
end;
if (from < 0) or (from > Len - 1) then
//raise new ArgumentException(GetTranslation(PARAMETER_FROM_OUT_OF_RANGE));
begin
Writeln('PARAMETER_FROM_OUT_OF_RANGE');
Exit;
end;
var cnt := step > 0 ? Len - from : from + 1;
var cntstep := (cnt - 1) div abs(step) + 1;
if count > cntstep then
count := cntstep;
end;
function SliceArrayImpl<T>(Self: array[,] of T; from1, step1, count1, from2, step2, count2: integer): array[,] of T;
begin
CorrectCountForSlice(Self.RowCount, from1, step1, count1);
CorrectCountForSlice(Self.ColCount, from2, step2, count2);
Result := CreateSliceFromArrayInternal(Self, from1, step1, count1, from2, step2, count2)
end;
/// Возвращает срез матрицы по строкам от индекса from1 с шагом step1 длины не более count1
/// Возвращает срез матрицы по колонкам от индекса from2 с шагом step2 длины не более count2
function Slice<T>(Self: array[,] of T; from1, step1, count1, from2, step2, count2: integer): array[,] of T; extensionmethod;
begin
Result := SliceArrayImpl(Self, from1, step1, count1, from2, step2, count2);
end;
begin
var a := MatrGen(9, 9, (i,j) -> 10*(i+1)+j+1);
a.Println(3);
Writeln;
var b:=a.Slice(0,3,2,2,2,3);
b.Println(3);
end.
Хотелось бы узнать, что из PABCSystem.pas можно безболезненно удалить?
Можете, пожалуйста разрешить следующее:
procedure p1(f: real->real := r->r);
begin
end;
begin end.
То есть указание значения по умолчанию для параметра - указателя на функцию, не создавая отдельное имя типа:
function f1(r:real) := r;
procedure p1(f:real->real := f1);
begin
end;
begin end.
Нет. В C# такого нет. И это - очень тяжело реализуемое.
Думаю, это на свой страх и риск. Вот, удаляете CreateSliceFromArrayInternal - и срезы перестают работать, да ещё и с падением компилятора. Оно Вам надо?
Так… “мазохизЬм” еще никто не отменял…
Спасибо! А компилятор будет постоянно падать, или только в каких-то случаях?
Только если Вы будете использовать соответствующую конструкцию. Если нет, код будет генериться нормальный
Я пишу программы на чистом .NET в стиле C#, поэтому никакие стандартные средства из PABCSystem мне не требуются.
Тогда пишите на C#. Тут нет никакой альтернативы.
PABCSystem пронизан синтаксическим сахаром.
В том то и дело, что Паскаль мне нравится больше, чем C#.
Вот именно поэтому я и спрашиваю про то, как его уменьшить(в идеале-отключить).
Мы такого специально не планировали. Поэтому Вы это делаете на свой страх и риск
Да да, я понял… Но всё равно, спасибо за информацию!
Можно ли сделать директиву компилятора, определяющую необходимость генерации PDB? При компиляции из файлового меню, отладочная информация генерируется всегда. Кроме того, в среде периодически появляется галочка в соответствующем поле настроек компилятора, что делает необходимым периодическое её отключение.