Ошибки PascalABC.NET


#1432

Хорошо, если вы не будете исправлять - напишите об этой особенности языка в справке или где то ещё. И добавьте своё сообщение об ошибке, которое будет объяснять почему это всюду после скобочек можно использовать точку, а тут нельзя. Такого типа:
Использование "." после оператора, на строчке с объявлением переменной и её типа - запрещено.
Длинно, но вы поймите, отсутствие нормального объяснения не только сбивает с толку в смысле “а что я сделал не так?”, а ещё и в смысле “это ошибка или так и задумано?”. Через пол года, когда я забуду про эту недо-фичу - я снова потрачу много времени на попытки найти что вызвало такое странное поведение, только чтоб в конце понять что это ещё один дубль #796. Очень демотивирует, знаете ли, когда много труда и времени выбрасывается в форточку.


Использование "." после оператора, на строчке с объявлением переменной и её типа
#1433
begin
  var d:=new Dictionary<byte,word>;
  d.Add(1,2);
  //var s:sequence of word := d.Values + word(5);//Ошибка: Нет перегруженной подпрограммы с такими типами параметров
  var s:sequence of word := IEnumerable&<word>(d.Values) + word(5);
  s.Println;//Выводит "2 5", как и ожидалось
end.

Почему тут не даёт написать d.Values + word(5), это ошибка?


#1434

Есть серия issue. Общее у них то что у как то полученной записи вызывается метод, и компилятор создаёт для этого вызова не правильный IL код. Прослеживается следующая тенденция:

  • #901 - метод возвращает запись;
  • #910 - конструктор возвращает запись;
  • #974 - глобальная/статичная функция возвращает запись;

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


#1435

@admin, @ibond, можете пожалуйста посмотреть сюда и сказать, является ли внутренняя ошибка при компиляции test.pas ещё 1 проявлением #951?

Там 5 модулей, циклично скреплённых друг с другом, очень не хочется без лишней причины всё это разгребать))).


#1436

свойство типа записи, поле типа запись, приведение оbject к типу запись


#1437

Инициализация массива массивов в сокращенной форме. Ошибка выполнения: Индекс находился вне границ массива.

begin
  var c: array of array of integer := ((1,2,3),(4,5,6,7),(6,7,8)); //тут ошибка рантайма
  c.Println
end.

А вот пример, который в справке

begin
  var c: array of array of integer := ((1,2,3),(4,5),(6,7,8));
  c.Println;//[1,2,3] [4,5,0] [6,7,8]
end.

вроде бы и работает, но почему второму под-массиву (ну который первый по индексу) дописывается третий элемент - 0?


#1438

#1439

Да, это правильно. Память подстраивается под первую строку.

Вообще, эту инициализацию я бы запретил - именно из-за неё у нас большие проблемы с различием между

var x := выражение;

и

То есть, синтаксис старой Delphi нас тянет назад
var x: T := выражение;

#1440

Так это ошибка или нет, я не понял. А еще можно спросить, у вас написано в справке, что

var a := Arr(Arr(1,3,5),Arr(7,8),Arr(5,6)); // array of array of integer

но при наведении на переменную в рамке пишет: var a: array of T; как это понять, компилятор не выводит тип или справка не соответствует? %D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA


#1441

Это не ошибка.

Система Intellisense, выводящая типы при наведении, у нас не такая мощная и не выводит тип T.


#1442

Ну, в #884 вы тоже сказали что это слишком сложно для вашего анализатор кода, но оказалось просто. Давайте всё же разберёмся перед тем как говорить что вы не сможете это реализовать.


#1443

Но это сбивает с толку. И какой массив получается на выходе? С подмассивами одинаковой длины “отнормированными” по первому? А зачем? Вся фишка массива массивов в том, что у него внутренние массивы разной длины, а так получается, что, в лучшем случае, их дополняет нулями. И что же делать? Инициализировать другими способами можно, но что с этим способом? Уберете его?


#1444

ibond у нас ответственный за Intellisense. А где я говорил, что не будем реализовывать?


#1445

А может вспомнить, что основная ниша - это обучение и не оглядываться постоянно на Delphi там, где это вредит языку?

Как пример, была такая настольная СУБД - FoxPro. Еще в ДОС-версиях, тогда еще Microsoft и не думал ее приобретать. Кроме совершенно новых и продвинутых инструментов, она содержала в себе все, что было у предшественников - dBASE и FoxBASE, как и PasalABC.NET содержит в себе “наследие предков”. Это было понятно: имелось большое количество старых наработок и надо было дать возможность безболезненного портирования. Потом появились версии Visual FoxPro (VFP в народе), которые по-прежнему тащили в себе груз еще от dBASE - но это оправдывалось тем, что "а вот люди перешли со старых программ на FoxPro/DOS и теперь им надо обеспечить портирование под VFP. Выходили новые версии VFP, впечатленная производительностью, эту СУБД приобрела Microsoft. А старое наследие в языке так и оставалось. И только в последних версиях, когда уже ясно стало, что сохранение “старья” тормозит новые концепции, от него начали избавляться. Да и то в виде полумеры: директивным переключением движка СУБД между разными синтаксисами.

Может, пора бы и в PascalABC.NET кое от чего избавиться, если оно сильно мешает, а не воевать с этими ветряными мельницами? А то может получиться, как старом анекдоте.

Посетитель небольшого кафе делает заказ и в ожидании разглядывает интерьер. Его внимание привлекает большой транспарант: “Война мухам!”. Между тем мухи с немалым энтузиазмом в заведении присутствуют. Посетитель интересуется у официанта, как это соотносится с лозунгом о войне и получает ответ: “Да, война была. Но мы проиграли…”

Не хотелось бы проиграть войну из-за вопроса совместимости чего-то там с какой-то устаревшей Delphi.


#1446

Вы сказали что это не ошибка. не_ошибка, в моём понимании, это то что так и задумано, а значит и не должно быть исправлено. Ну ладно, тогда тоже закину в issue.


#1447

Нет, это я сказал по поводу разного количества элементов во вложенных массивах.


#1448

Модуль Graph3D. Не работает анимация масштабирования при задании параметра времени выполнения. “Ошибка времени выполнения: System.InvalidProgramException: Среда выполнения Common Language Runtime обнаружила недопустимую программу.”


#1449

Ошибка действительно не правильная, но приведите пожалуйста код. Из описания словами не понятно.


#1450

Пример программы есть в папке “Samples”. Вот этот тоже не работает:

uses Graph3D;
begin
  var b := Sphere(Origin,0.2,Colors.red);
  var c:=b.AnimScale(3,1);
  c.Begin;
end.`

Если вместо " var c:=b.AnimScale(3,1)" написать просто “var c:=b.AnimScale(3)”, то ошибки не будет.


#1451

У меня не воспроизводится (ваша программа и все программы из Samples, содержащие AnimScale). Возможно это уже исправили в последней версии? Попробуйте обновиться.