Ошибки PascalABC.NET

type
  e1=(
    es1 = 1,
    es2 = 2
  );

begin end.

Форматируется в:

type
  e1 = (es1= 1,
  es2= 2
  );

begin end.

То есть es1 никак не даёт описать на следующей строчке. А ещё оно убрало пробелы между es1 и =, и так же с es2.

Что из этого годится для issue и сколько отдельных делать?

Это issue.

Ну, по крайней мере, можно так вручную:

begin
  var x10:=(1,2,3,4,5,6,(7,8,9,10));
  println(x10.Item7.Item4)
end.

Есть код:

type
  t1=class
    
    procedure p1;
    procedure p2;
    procedure p3;
    
  end;

begin end.

Я нажимаю ПКМ на p2 и “Сгенерировать реализацию”. После этого реализация генерируется не только для p2, но ещё и для p1 и p3. Это ошибка? Вообще это обычно удобно, но не всегда. Возможно стоит сделать 2 кнопки: просто “сгенерировать реализацию”, которая будет работать для чего то 1, и кнопка которая будет генерировать реализацию сразу всего?

Пишите руками :slight_smile:

1 лайк

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

Например, в C# Interactive VS можно набрать var t9 = (1,2,3,4,5,6,7,8,9);

Потом на следующей строчке начать набирать t9.ToTuple и посмотреть выбор, который он предлагает. В нём видно, что разбивка идёт именно 7+2.

А почему тогда на CIL руками не писать, зачем удобства, действительно… Ну а всё таки, “Сгенерировать реализацию”, зачем то существует, как именно оно должно работать?

Нет, не стоит. Это как реализация интерфейса. Либо все, либо ничего.

1 лайк

Я не могу найти причину ошибку в этой программе (93,8 КБ). Сейчас если откомпилировать BFC.pas получаем внутреннюю ошибку компилятора. Если удалить все .pdb и .psu, BFC.pas откомпилируется 1 раз нормально, а на следующий снова получаем ту же ошибку.

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

У меня вся корзина уже в .psu и .pdb файлах, после нескольких попыток начать заново. Возможно есть какой то другой способ, менее геморный и, что важнее, более рабочий?

Это баг в паттернах в связке с pcu.

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

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

3 лайка

Есть код:

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, но вроде там всё ок.

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

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

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

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, вместо исключения.

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

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

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

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

image

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

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

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

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

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