Неявное преобразование real → integer

Значит, можете считать меня колдуном :smile: Я же сделал его.

Когда человек утверждает, что он реализовал в программе что-то, что реализовать синтаксически нельзя, его скорее можно счесть не колдуном, а кое-кем другим, чье название имеет такое же окончание, но иное начало, хоть и само слово созвучно )))) Просто код приведите, раз там 4 строки, если это не великий секрет.

Сами попробуйте написать код

Uses System;
Class function Double.operator implicit(d: Double): Int32;
begin
  Result := Convert.ToInt32(d);
End;
Begin
  Var i: Int32 := 5 / 3;
  Console.WriteLine(i);
End.

И почувствуйте себя тем, о ком говорили.

Именно так в 1 из следующих билдов сделать нельзя будет, но всё равно можно так:

function operator implicit(r:real):integer; extensionmethod;
begin
  Result := System.Convert.ToInt32(r);
end;

Вот только в отличии от div - вы тут делаете

Convert.ToInt32(real(5)/real(3))

Это на много медленнее, ибо лишние преобразования + деление чисел с плавающей запятой всегда медленнее.

Я уже жалею, что напомнил про это… Не надо убирать этого, пожалуйста!!!

Ничто не мешает изменить метод или вообще переопределить метод деления, а в его теле написать div. Это, кстати, будет правильнее.

Это уже исправили, до того как вы напомнили. Это давало много конфликтов. Но как я и сказал, это в целом никто не запрещает, если вы хотите себе стрелять в ногу рандомными преобразованиями real к integer - флаг вам в руки.

Вы это называете “сделал себе оператор inmplicit” ? Тогда, простите, у Вас проблемы с семантикой. Вы не имплисит себе сделали, а перегрузили оператор деления /.

Вы издеваетесь? Там может быть любой double. То, что деление его даёт, ещё не значит, что это единственно возможный случай. Про деление писал выше.

А где вы видите перезагрузку оператора деления? И это тоже она?:

function operator implicit(r:real):integer; extensionmethod;
begin
  Result := System.Convert.ToInt32(r);
end;

begin
  var a:integer := 0.0;
end.

Давайте вы будете пробовать компилировать у себя код и эксперементировать перед тем как начинать утверждать))

1 лайк

Да, я невнимательно посмотрел. Вы просто сделали преобразование типа double в integer через Round. Насколько это плохо - Вам уже писали. Удивительно, что наряду с этим Вы печетесь о высокой производительности операций в Паскале.

Нет, всё ещё не достаточно внимательно))) Convert.ToInt32 делает это в стиле C.

Вы дважды невнимательно прочитали. Мне уже сделали замечание и я сказал, что надо перегружать напрямую деление. В теле писать div.

Сергей, как Вам удаётся так быстро отвечать? :joy:

Convert делает преобразование с округлением. Round делает то же самое. Вот примерчик:

function real.operator implicit(r: real) := System.Convert.ToInt32(r);

begin
  var a:=new integer[4] (5/3,3/7,-2.1,-6.9);
  a.Println;
end.

Это к чему?

Я предлагаю сделать проще.

const True=False;

И директиву чтобы этот код невозможно было отключить.

3 лайка

Но у меня есть ключик, зашитый в .NET:

System.Boolean.Parse('True');

Костылять - так костылять…

Можно изящней. В моём стиле.

Uses System;
Uses System.Windows.Forms;

Type MainForm = Sealed Class(Form)
  public static Tr := System.Boolean.Parse('True');
  public constructor Create();
  Begin
    inherited Create();
    self.MaximizeBox := Tr;
  End;
End;