Ошибки компилятора PascalABC.Net

function _Max<T>(a,b,c,d: T): T; where T: IComparable<T>;
begin
  Result := a;
  if Result.CompareTo(b)<0 then Result := b;
  if Result.CompareTo(c)<0 then Result := c;
  if Result.CompareTo(d)<0 then Result := d;
end;
//ToDo так же Max с 2 и 3 параметрами

function Max_<T>(params a: array of T): T; where T: IComparable<T>;
begin
  Result := a[0];
  for var i := 1 to a.Length-1 do
    if Result.CompareTo(a[i])<0 then
      Result := a[i];
end;

//ToDo и всё это ещё раз, для Min

begin
  
  _Max(1,2,3,4).Println;
  _Max(4,3,2,1).Println;
  
  Max_(1,2,3,4).Println;
  Max_(4,3,2,1).Println;
  
end.

Это много методов, но явно меньше чем вот это вот всё:

///-function Max(a: число, b: число): число;
/// Возвращает максимальное из чисел a,b
function Max(a, b: byte): byte;
///--
function Max(a, b: shortint): shortint;
///--
function Max(a, b: smallint): smallint;
///--
function Max(a, b: word): word;
///--
function Max(a, b: integer): integer;
///--
function Max(a, b: BigInteger): BigInteger;
///--
function Max(a, b: longword): longword;
///--
function Max(a, b: int64): int64;
///--
function Max(a, b: uint64): uint64;
///--
function Max(a, b: real): real;


///-function Min(a: число, b: число): число;
/// Возвращает минимальное из чисел a,b
function Min(a, b: byte): byte;
///--
function Min(a, b: shortint): shortint;
///--
function Min(a, b: word): word;
///--
function Min(a, b: smallint): smallint;
///--
function Min(a, b: integer): integer;
///--
function Min(a, b: BigInteger): BigInteger;
///--
function Min(a, b: longword): longword;
///--
function Min(a, b: int64): int64;
///--
function Min(a, b: uint64): uint64;
///--
function Min(a, b: real): real;

///-function Min(a,b,...: T): T;
/// Возвращает минимальное из a,b,...
function Min<T>(params a: array of T): T;
///--
//function Min(params a: array of real): real;
///--
function Min(a, b, c: real): real;
///--
function Min(a, b, c, d: real): real;
///--
function Min(a, b, c: integer): integer;
///--
function Min(a, b, c, d: integer): integer;

///-function Max(a,b,...: T): T;
/// Возвращает максиимальное из a,b,...
function Max<T>(params a: array of T): T;
///--
//function Max(params a: array of real): real;
///--
function Max(a, b, c: real): real;
///--
function Max(a, b, c, d: real): real;
///--
function Max(a, b, c: integer): integer;
///--
function Max(a, b, c, d: integer): integer;

При этом функционала наоборот больше даёт.

Тесты ошибок - там только знак (>/<) перепутать можно, но это уже протестировано теми 4 строчками в begin-end.

Тесты скорости - я уже показал предыдущим сообщением, что это НЕ медленнее, чем писать отдельные Min и Max для каждого типа.

Может я чего то не знаю… Разве есть какая-либо гарантия что .CompareTo всегда будет возвращать только -1, 0 и +1? Да и, в конце концов, пользовательские типы…

Ну заменить на > 0 тогда

Дело не в медленнее. Min(1,2.5,3) - обобщённый метод не сможет вызваться. Тип T не выведется.

Ну тогда оставить перегрузку для real, а вместо Max(a,b: byte, smallint, word, shortint, longword, integer, int64, uint64) сделать методы приведенные выше, кода все равно поубавится

Спасибо за предложение

1 лайк

Тут дело такое, что прежде чем говорить об ошибке (они есть, конечно же, в каждой сборке что-то, да меняется, правда, не всегда именно ошибка исправляется, есть и замены, добавления), обязательно надо скачать самую новую версию и проверить на ней.

2 лайка

При использовании библиотеки SFML после нескольких десятков успешных запусков программ. Все программы перестали запускаться, выдавая три типа ошибок:

  • Нет перегруженной подпрограммы с такими типами параметров
  • Нельзя преобразовать тип SFML.System.Vector2f к SFML.System.Vector2f
  • Нельзя преобразовать тип SFML.Window.VideoMode к SFML.Window.VideoMode

После нескольких часов танцев с бубном и гуглежа всё снова заработало, но буквально через полчаса опять посыпались эти ошибки. Перезапуск/переустановка PascalABC.net проблему не решают, перезапуск ПК тоже не помогает. Как прошлый раз восстановил работоспособность - сам не понял. Использованный код и библиотека: ссылка Используемая ОС: Win10x64

Автор книги (В. Рубанцев) рекомендует сначала запустить SFML shader.pas Помогите решите эту проблему.

Я даже к программе на C# не могу эти сборки подключить:

Там что-то с этими сборками не так

Следуйте совету Рубанцева. Другие бубны не помогут. Это не проблемы сборок. Такие ошибки компилятор выдаёт и с другими сторонними библиотеками. У компилятора время от времени ум заходит за разум. Если дать ему время очухаться, то всё снова заработает. На Си-шарпе все сборки работают. Я целую книгу написал про SFML на Си-шарпе. Там проблем нет.

PascalABC.NET - прекрасная вещь, но всё же хотелось бы большей надёжности в поведении. Я стараюсь рекламировать и в меру сил продвигать эту систему, но подобные ошибки убивают энтузиазм.

Ага, понятно - вижу.

Валерий, скачайте последнюю версию и попробуйте - всё ли теперь работает.

2 лайка

Глубоко не копал, но на паре программ всё работает! Если так, то SFML смело можно использовать в программах. А там есть немало интересного!

Да! И похоже, что большинство ошибок с другими .NET dll ушли

1 лайк

Неожиданный, но приятный побочный эффект!

1 лайк

17 сообщений перенесены в тему Мнимые ошибки PascalABC.NET

Странно работает код:

  ReadArrInteger(ReadInteger)
    .Combinations(2)
    .Where(x->x.Sum mod 11 = 7)
    .OrderByDescending(x->x.Sum)
    .Print;

// 8 56 1 12 19 71 85 39 21 
// [39,21] [39,21] [39,21] [39,21] [39,21]  <<<= должны быть разные! как ниже
  ReadArrInteger(ReadInteger)
    .Combinations(2)
    .Where(x->x.Sum mod 11 = 7)
    //.OrderByDescending(x->x.Sum)
    .Print;

// 8 56 1 12 19 71 85 39 21 
// [56,39] [1,39] [12,39] [19,21] [85,21]
 var a = new[] { 56, 1, 12, 19, 71, 85, 39, 21 };
 var n = a.Length;
 var aa = a.SelectMany((x, i) => a.Skip(i + 1).Select(y => new[] { x, y }));
 var seq = aa.Where(t => t.Sum() % 11 == 7)
    .OrderByDescending(t => t.Sum());
 Console.WriteLine(string.Join(" ",seq.Select(t=>$"[{t[0]}+{t[1]}]")));

// [85+21] [56+39] [12+39] [1+39] [19+21]

PS: И не пишите, что это неэффективно. Я тесты генерировал для проверки )

Исправил. Залил на сайт.

Дело в том, что в Combinations(2) возвращался всё время один массив. Пришлось делать клоны всякий раз. Стало ещё более неэффективно. Зато сохраняется запись “в строчку”.

Видимо, надо сделать функцию NextCombination, которая переставляла бы элементы массива. Тогда бы программист думал бы, как сделать клоны этого массива и потом отсортировать.

А когда планируется новый релиз с исправленной ошибкой?

Я же написал, что залил на сайт. Проверьте