Ошибки IDE PascalABC.Net

Да я вот сначала тоже так подумал)) Хотел уж было писать, что операция + не перегружена для BigInteger. А вот нет, перегружена))0). Да и число маленькое, его можно уместить в int64.

Но с ОЧЕНЬ БОЛЬШИМИ числами это тоже работает, так что не вижу смысла дублировать операцию += в виде древнепаскальской процедуры.

begin
  var b := new byte[32];
  System.Security.Cryptography.RNGCryptoServiceProvider.Create.GetBytes(b);
  var bi := new BigInteger(b);
  bi.Println;
  bi += 1;
  bi.Println;
end.

Насчет “оставленные для совместимости” Вы неправы. Собственно, я тоже был когда-то такого же мнения, но разработчики меня поправили.

Какой смысл в Inc и Dec, если есть += и -=?

А это уже не ко мне вопрос.

В старых решениях Inc и Dec иногда фигурируют, для них обязательно нужна совместимость, потому эта фигня в языке и есть. Во всех остальных смыслах Inc и Dec бесполезны.

Кстати, у Inc и Dec очень уж интересная реализация)))

procedure Inc(var i: integer);
begin
  i += 1;
end;

procedure Inc(var i: integer; n: integer);
begin
  i += n;
end;

procedure Dec(var i: integer);
begin
  i -= 1;
end;

procedure Dec(var i: integer; n: integer);
begin
  i -= n;
end;

Я не считаю правильным открывать дискуссию о “полезных” и “бесполезных” конструкциях, уже присутствующих в языке. Это прерогатива разработчиков. Другое дело, когда обсуждается целесообразность вводить в язык что-то дополнительное - там дискуссия на мой взгляд может быть полезна.

Не, ну почему. Давайте поговорим) Для чисел Inc и Dec в PascalABC.NET полностью вытеснены += и -=. Но есть польза от Inc и от Dec с символами:

begin
  'Йнснб'.Select(x ->
  begin
    var c := x;
    Inc(c);
    Result := c;
  end).Print;
end.

А также есть и функции, делающие то же самое:

begin
  'Йнснб'.Select(x -> Succ(x)).Print;
end.

Вас не понять. То конструкции бесполезны, то полезны “в некоторых смыслах”… Вы уж там определитесь и выскажите свою четкую позицию разработчикам. Только не тут, ибо оффтопик.

Все правы. Inc и Dec оставлены для совместимости. В новом коде надо использовать += и -=. Поскольку в старом коде BigInteger встретиться не может, то для него и нет Inc и Dec.

Мы как можем стимулируем переход на новый нормальный код.

2 лайка

Кстати, как выяснил, моя функция работает для чисел от -9223372036854775808 (int64) до 18446744073709551615 (uint64) .


Иначе либо слишком маленькое, либо слишком большое число соответственно.

Так можно и факториалы находить (выдержка из моего модуля):

function intfact(a:BigInteger):BigInteger;
    begin
    intfact:=1;
    var i:biginteger:=2;
    while i <= a do
      begin
      intfact*=i;
      i+=1;
      end;
     end;  

Здесь Ваша программа работает на еще большем числе. И

да, сейчас лучше и удобнее (на мой взгляд) пользоваться специальными операторами присвоения,
чем функциями инкремента и декремента в PascalABC.Net. Но повторю о возникновении ошибки:

Следовательно, хотел бы узнать, как правильно сообщить об ошибке разработчикам.

Сюда напишите

Спасибо! Написал.

А, так дело не в вашей функции. Вот только, у меня с другими числами и не компилируется:

И правильно, дальше переполнение произойдёт. Надо писать так:

begin
  var i := BigInteger.Parse('18446744073709551616');
end.

Раз у вас не выдаёт ошибку как у меня на скрине - значит у вас устаревшая версия компилятора. Всегда проверяйте обновления перед тем как сообщать ошибку, а то вы путаницу создаёте.

1 лайк

Всё правильно, Ваше число за пределами uint64, у меня такая же ошибка.
Для моей функции работает

как Вы и цитировали.

PascalABCCompiler.Core v3.5.0.2167 (01.07.2019), debug version
Runtime version: 4.0.30319.42000
OS version: Microsoft Windows NT 6.1.7601 Service Pack 1
Processor count: 4
WorkingSet: 147716 kb  

Свежайшая позавчерашняя.

Так подождите, а для каких значений тогда неправильный вывод?

Кстати, спасибо! Работает:
image

Но, это, если что, далеко не самый быстрый способ присвоить число… Если будете делать сохранение/загрузку каких то данных - лучше преобразовывайте BigInteger к массиву байт. А из строки - это только для тестирования/задания констант нормально.

Для любых, без использования дополнительной функции, то есть " Нет перегруженной подпрограммы с такими типами параметров".

Так это не вывод а ошибка. Ошибки тоже “выводятся”, но когда говорят “вывод” - обычно имеют в виду содержимое потока вывода (System.Diagnostics.Process.StandardOutput).

Я имел ввиду, что мой модуль с inc(a:biginteger) работает правильно, так как вывод верный.
А в системном модуле такой функции не было, значит и происходила ошибка.