Ошибки PascalABC.NET


#1411

Ну, мне это мало что говорит… Скажите лучше как найти причину, и добавлять ли в issue.


#1412

Ну откажитесь на время от контрукции if ge is MateGE(var mate). Фикс прилетит на неделе.


#1413

Есть код:

type
  t1=class
    a:shortint? := nil;
  end;

begin
  var a := new t1;
end.

Ставим точку останова на begin и запускаем. Когда доходит до точки останова нажимает F9;

Результат на win7x64: всё ок.
Результат на win7x32: ExecutionEngineException.

Если не ставить точку останова - по F9 программа просто вырубается, а оп Shift+F9 вылетает с сообщением “Прекращение работы программы”.

А самое интересное, что если откомпилировать на win7x64 и запустить .exe на win7x32 - программа всё равно вылетит.

Что это может быть? Я ещё пытался декомпилировать код, сгенерированный компиляцией на win7x32, но вроде там всё ок.


#1414

Возможно я ошибаюсь, но мне кажется, что в этом коде должна быть ошибка выхода индекса за границы диапазона?

begin
  var s := 'ABC ';
  var i := Pos(' ', s);
  write(Pos(' ', s, i + 1)); //0
end.

#1415

Нет, всё правильно, потому что следующий код тоже не вызовет ошибку:

begin
  var a := Arr(1,3,5);
  for var i := 5 to a.Length-1 do
    writeln(a[i]);
end.

Узнать как оно работает точнее, потому что для этого используется WinAPI. Но в любом случае, это стандартная функция .Net . Паскаль лишь добавляет вывод 0 когда subs пустая или nil, вместо исключения.


#1416

так там sub не пустая, там пробел, ну можно по другому

begin
  var s := 'ABC';
  var i := Pos('C', s);
  write(Pos('C', s, i + 1));
end.

тут тоже нет ошибки, а вот если Pos(‘C’,s,i+2) то уже выдает ошибку


#1417

А вот как… Похоже, оно вот так сопоставляет from со строкой:

image

В .Net версии там идёт от 0 до 3, но паскаль посылает .Net версии from-1 вместо from, поэтому получается от 1 до 4.

В случае когда вы посылаете i+1 (что было бы просто i, если бы не было -1 выше) - вы ищите в пустой строке, что допустимо.

Действительно, зачем всё сдвигать на еденичку - не понятно. Но то что значения больше i+1 выдают ошибку это стандартный функционал .Net .


#1419

Не должна быть. Поправили реализацию. В обновлении будет работать корректно - без исключений


#1420

#1421

2 сообщения перенесены в тему Болталка PascalABC.NET


#1422
begin
  var i: integer?;
  i := true ? nil : 5;
end.

Пишет что нельзя присвоить value-типу nil, хотя в данном случае подразумевается что результат будет Nullable. Это ошибка?


#1423

В C# это тоже не работает:

int? j = true ? null : 5;

#1424

Там сообщение об ошибке другое


#1425

Тут разрешает НЕ ставить точки с запятой:

type
  t1=class
    
    b1:byte
    
    public
    
    b2:byte
    
  end;

begin end.

А с методами так не проходит:

type
  t1=class
    
    function f1:byte := 0
    
    public
    
    function f2:byte := 0
    
  end;

begin end.

Так и задумано?


#1426

К сожалению, да. В конце секции можно не ставить. Это сделано для совместимости с Delphi и Borland Pascal. Там такое компилируется

type
  t1=record
    b1:byte
  end;

Методов внутри там нет, потому для методов мы это уже запретили


#1427

15 мая был откачен фикс #796, и с того момента стало ещё хуже. Теперь не только компилятор не работает для var d: t1 := (a + b).f1. Теперь эта строчка ещё и полностью ломает анализатор кода:

image

Точки сворачивания просто не появляются.

Можете, пожалуйста, объяснить ситуацию с этой issue, чтоб я понимал что является ошибкой а что нет?

И, желательно, исправить хотя бы сообщение об ошибке, потому что Встречено '.', а ожидалось ';' полностью сбивает с толку. В такой короткой строчке ещё можно догадаться что не так, но я успел отбить себе лоб об эту невидимую стену, в местах где всё не так элементарно.


#1428

Конструкция (a + b).f1 давала конфликты в грамматике. Как-то мы это пропустили.

Конфликты в грамматике - это вот что такое. Это значит, что правильная программа случайно может оказаться неправильной и наоборот. Причем, непредсказуемо. Это - кошмар.

Эта ошибка просуществовала какое-то время. Плохо, что мы её заметили не сразу. Откатили.

По поводу сообщения об ошибке. Оно Вам не нравится, но оно верное. После (a+b) может идти точка с запятой. Точка теперь идти не может. Вот и выдаётся это сообщение об ошибке.

t1(a + b) - это вызов функции - после него точка может идти

То, что Вы хотите всё-таки точку, вас сбивает


#1429

Вот так работает - уже прекрасно )))

begin
  var (a, b) := (3, 5);
  (a+b).ToString.Println
end.

#1430

Ну так правильно. В заголовке issue так и сказано, надо не только оператор, а ещё и объявление переменной с : <тип этой переменной>. И это главная проблема. Во всех случаях после скобок даёт ставить точку. По крайней мере я не знаю таких. А тут, вдруг.

Но это всё же не повод говорить что вы никогда не исправите. Хотя бы оставьте ту issue, отложив в долгий ящик. Это всё же лучше.

И что с анализатором кода? Он, вроде, на момент создания issue не был сломал и сломался только после отката. То как он себя в этой ситуации ведёт - ну очень не хорошо.


#1431

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