Ошибки PascalABC.NET


#1505

А разве не integer и int64 ? Другое дело, что int64 преобразуется к integer молча и простым копированием четырех байт из восьми. Такое ощущение, что тут С/С++ порылся.

А нельзя ли, чтобы выбирался не левый, а более “длиннобайтовый” для случая целых чисел ? Чтобы работало как в Справке для арифметических выражений? Для удобства и единообразия.


#1506

Ух ты, табличка какая классная! Где Вы её взяли?


#1507

Это шутка юмора была? Ваша же Справка…


#1508

@Admin Кстати, в этой табличке не хватает типа decimal.


#1509

Еще ошибки вывода типов (при участии Decimal):

begin
  // 1) Ошибка интеллисенса: 
  // Если один из операндов арифметической операции типа Decimal,
  // а второй -- типа ShortInt, Byte, SmallInt, Word или Integer, 
  // то результирующий тип отображается как Integer, а не Decimal.
  var r1 := decimal(1) + shortint(2);
  
  // 2) Ошибка интеллисенса: 
  // Если операнды Decimal и Int64, то результат по интеллисенсу всегда Int64, а не Decimal.
  var r2 := decimal(1) + int64(2);
  
  // 3) Ошибка компилятора:
  // Если один из операндов арифметической операции типа Decimal,
  // а второй -- типа LongWord или UInt64, то возникает ложная ошибка 
  // "Возможны два преобразования типов" при компиляции.
  var r3 := decimal(1) + uint64(2);
  
  // При этом также есть ошибка типа c интеллисенсом, но только для случая с Longword:
  // отображается тип Int64 вместо Decimal.
  var r4 := decimal(1) + longword(2);
end.

@Admin Фиксировать это в Issues?


#1510

Вы слишком увлеклись: в PascalABC.NET типа decimal нет. См. Справку. Это тип .NET, с которым Вы работаете на свой страх и риск.


#1515

Пока все тут спорили - @Admin сам сделал issue))


#1522

@Admin Хотел написать предыдущий пример более корректно, как

var a := decimal(0.1) + decimal(0.2);

но вылетает странная ошибка “Возможны два преобразования типа: к типу System.Decimal и к типу System.Decimal”


#1523

Да, там с преобразованиями к decimal у нас что-то не в порядке


#1524

По моему, эти ссылки всё же надо давать, потому что даже если вы сами увидели - могут быть те что не увидят. Более того, если кто то будет читать это потом - будет сложно связать 2 события, надо будет проверять по времени.


#1525

В целом, большинство операций работает корректно.

begin
  var a: decimal;
  Decimal.TryParse('12345678901234567890.123456789', a);
  Println(a); // все цифры из литерала точны
  // a.Println; //вызовет ошибку " Неизвестное имя 'Println' "
  a.ToString.Println; // работает
  Writeln(real(a)); // вывод 1.23456789012346E+19
  Writeln(single(a)); // вывод 1.234568E+19
  //a += a; // ошибка " Операция '+=' не применима к типу System.Decimal "
  a := a - 0.000000001;
  Println(a); // нормально чувствует 29-й знак в числе
  a := 1e-10 * a;
  Println(a); // абсолютно верный результат
end.

По поводу issure - там где-то “косяк”, потому что a := c работает нормально.


#1526

Здесь всё верно. += не работает - да, мы его не определяли


#1527

Ну, может, и хорошо :slight_smile: А то потом мерзкие статьи на хабре появляются :joy:


#1528

Жалко, что не определяли a.Println;

Наверно, мысль написать книгу была правильной. Я сейчас пока по целочисленным иду, разыскиваю на примерах различные подвохи, которые могут происходить по незнанию или неаккуратности. Вот как до вещественных дойду, посмотрим что с ними :grinning:


#1529

Для всего нельзя. Это надо для каждого типа индивидуально.


#1530

А я и не прошу. Просто отметил, что жалко… Как бы нет единообразия. Вот тут .Print работает, а тут - нет. Кстати, для decimal не определена даже Sqr, не говоря о более серьезных функциях. Видимо, доллары в квадрат не возводят…


#1531

Да, это немного чужеродный тип


#1534

@admin, в #998 я использовал тайпклассы только потому что файл которым я тестировал уже был с ними, так меньше менять. С интерфейсами тоже не так:

type 
  I1 = interface end;
  
  t1=class(I1) end;
  
procedure p1<T>(o:T);
where T: I1;
begin
  writeln('I1');
end;

procedure p1<T>(o:T);
begin
  writeln('not I1');
end;

begin end.

Тут пишет что p1 повторно объявлена. Это ошибка? Если нет, то как сделать чтоб на уровне компилятора решало какую подпрограмму вызвать?


#1538

тут

Умножение процедуры на число

procedure p := Write(1);
procedure q := Write(2);
procedure ln := Writeln;
procedure Run(p: procedure) := p;

begin
  a1 := p*10 + ln; **//Пропущено var**
  a1;
  a1 := p*10 + q*10 + ln;
  a1;
  Run((p + q)*10 + ln);
end.

Дальше:

Лямбда-выражения

Эквивалентный код без лямбд

function Cond(x: integer): boolean;
begin
  Result := x mod 2 = 0;
end;

function Fun(x: integer): boolean; **//integer а не boolean**
begin
  Result := x*x+1; **//а откуда +1?**
end;

begin
  var a := Arr(1,2,3,4,5,6,7,8,9);
  a.Where(Cond)
  .Select(Fun).Println;
end.

Ещё

Типы процедурных переменных

real->real – тип функции с параметром типа real, возвращающей real
(real,real)->real – тип функции с двумя параметрами типа real, возвращающей real
()->integer – тип функции без параметров, возвращающей real //А по моему integer
(real,real)->() – тип процедуры с двумя параметрами типа real

Это, скорее всего, не всё. Как насчёт просмотреть всё же презентации, перед тем как постить?)) (ну и теперь, те что запостили, это всё сразу в глаза бросается)


#1539

Ничего не понял. Слайд про умножение процедуры на число не про лямбды