Это 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, и кнопка которая будет генерировать реализацию сразу всего?
Пишите руками
Так это другой картеж, с семью элементами: шесть чисел и один картеж. Там именно восьмой элемент был особого типа, как раз для решения таких проблем и создания n-tuple.
Например, в C# Interactive VS можно набрать var t9 = (1,2,3,4,5,6,7,8,9);
Потом на следующей строчке начать набирать t9.ToTuple
и посмотреть выбор, который он предлагает. В нём видно, что разбивка идёт именно 7+2.
А почему тогда на CIL руками не писать, зачем удобства, действительно… Ну а всё таки, “Сгенерировать реализацию”, зачем то существует, как именно оно должно работать?
Нет, не стоит. Это как реализация интерфейса. Либо все, либо ничего.
Я не могу найти причину ошибку в этой программе (93,8 КБ). Сейчас если откомпилировать BFC.pas
получаем внутреннюю ошибку компилятора. Если удалить все .pdb и .psu, BFC.pas
откомпилируется 1 раз нормально, а на следующий снова получаем ту же ошибку.
Я пробовал убирать части программы, удаляя все .psu и .pdb перед каждой компиляцией. Но в определённый момент ошибка пропадает и если откатить последние части программы, которые я убрал - она не возвращается.
У меня вся корзина уже в .psu и .pdb файлах, после нескольких попыток начать заново. Возможно есть какой то другой способ, менее геморный и, что важнее, более рабочий?
Это баг в паттернах в связке с pcu.
Ну, мне это мало что говорит… Скажите лучше как найти причину, и добавлять ли в issue.
Ну откажитесь на время от контрукции if ge is MateGE(var mate). Фикс прилетит на неделе.
Есть код:
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
со строкой:
В .Net версии там идёт от 0 до 3, но паскаль посылает .Net версии from-1
вместо from
, поэтому получается от 1 до 4.
В случае когда вы посылаете i+1
(что было бы просто i
, если бы не было -1
выше) - вы ищите в пустой строке, что допустимо.
Действительно, зачем всё сдвигать на еденичку - не понятно. Но то что значения больше i+1
выдают ошибку это стандартный функционал .Net .
Не должна быть. Поправили реализацию. В обновлении будет работать корректно - без исключений
begin
var i: integer?;
i := true ? nil : 5;
end.
Пишет что нельзя присвоить value
-типу nil
, хотя в данном случае подразумевается что результат будет Nullable
. Это ошибка?