Ошибки PascalABC.NET


#1482

Но раньше было вот так:

libraryMy

Об этом, кстати, я уже писал на форуме. Работа ведётся.


#1483

Да, помню. Сам тоже пробовал. Но хоть их потихоньку делают - их всё ещё не объявили официально. И, на сколько я понимаю, их всё ещё можно подключать только директивой, я бы хотя бы исправления этого подождал перед тем как использовать в своих программах.


#1484

Я вот уже пробую их использовать. Они, в принципе, готовы.


#1485

Нет, в проектах директивы подключаются автоматически.


#1486

А можно подробнее?


#1487

Да, и мне тоже))


#1488

Ну проект -> новый файл->пространство имен


#1489

То есть там же, где и библиотека, консольное приложение…


#1490

Нет. В открытом проекте переведите мышку в Структуру проекта (слева вверху) и щёлкните правой кнопкой по первой строке с названием проекта. Потом в контекстном меню Добавить\Новый файл. И там уже выбираете “Пространство имён”.


#1491

Теперь понял.


#1492

Извиняюсь заранее, если уже и так это знаете. На всякий случай. Visual Studio 2017 Community бесплатен если меньше 100 компьютеров и доход от его использования меньше 1 миллиона долларов в год (цифры мог немного переврать, но порядок тот). Надо просто форму заполнить и будет официальная лицензия. Я так и работаю. Инсталлятор у него более щадящий, чем предыдущие версии, кучу лишнего не ставит. Проект PascalABC.NET на github достаточно аккуратно сделан, так что после подключения к нему этой VS Community Вы можете спокойно компилировать, даже вносить какие-нибудь мелкие исправления.


#1495

Ошибка: Нельзя преобразовать тип real к integer

begin
  var a := 10;
  var b: real;  
  b := a < 5 ? a * 2 : a / 2;  //в этой строке
  b.Print
end.

а если с условным оператором то работает

if a < 5 then b := 2 * a
else b := a / 2;

и так тоже работает

b := a >= 5 ? a / 2 : a * 2;

#1496

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

Вот так работает: b := a < 5 ? a * 2.0 : a / 2;


#1497

Нет, это не баг. Тип выражения ? : определяется по типу первого выражения, а оно - integer


#1498

Это в паскале абц или в других языках программирования тоже? В C# нашел такое: %D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA


#1500

Тогда это бомбочка, которую очень легко себе подложить. Ибо как НИГДЕ НЕ СКАЗАНО про то, что “Тип выражения ? : определяется по типу первого выражения,” Быть может, это надо как-то в Справке упомянуть?


#1501

А что делать если слева и справа - два типа, для каждого из которых есть implicit - оператор в другой тип?


#1502

Ну… вот, к примеру, сюрпризик.

begin
  var (a, b) := (1, 2);
  var c := a > b ? 1234567 : 1234567891011121314;
  Println(c)
end.

Я всегда говорил, что много разных целочисленных при отсутствии у процессора аппаратного контроля за переполнением - зло.


#1503

Ну правильно, тип всего - это тип integer. Тут оба типа могут преобразовываться один в другой.


#1504

Сделали. Это работает. Если один тип можно преобразовать к другому не пользовательскими преобразованиями, а второй нет, то общим выбирается второй тип. Если оба можно преобразовать один к другому, то выбирается левый

На всякий случай - вот страница MSDN: https://msdn.microsoft.com/ru-ru/library/ty67wk28(v=vs.120) Там ничего не сказано, что делать, если оба типа целочисленные