Страница 1 из 1

Баги или фича?

Добавлено: 05 июн 2008, 16:44
galover
Всем привет. Заметил тут странные особенности компиляции:
вот такой код даст мессаджи в обоих выражениях:

Код: Выделить всё

if (true or Message('Whats a f..') = cmOk)
      {

      }

      if (false and Message('Whats a sh..') = cmOk)
      {

      }
хотя в других АЯ второй аргумент не вычисляется, если первый аргумент точно определяет результат выражения

и еще вот такой прикол

Код: Выделить всё


procedure Foo;
 var tmpVar;
{
  Message(tmpVar);
  tmpVar := 'Some val';
}

// Main code
Foo();
Foo();

вышеприведенный код выведет два сообщения - одно пустое, другое 'Some val'. Т.е. значения локальных переменных сохраняются у функции м/у вызовами, а не сбрасываются в значения по умолчанию. Жесть

Добавлено: 05 июн 2008, 20:57
Max_Fin
по 1-му RTFM, здесь просто оптимизация не включена, на дельфи можно добиться точно такого же результата, если включить соответствующую опцию компиляции.

по 2-му опять же RTFM, вам ни кто не гарантирует, что локальные переменные будут снова инициализироваться "пустым" значением (опятьже можно сослаться на паскаль/дельфи). Вообще надо взять за обязательное правило инициализировать переменные.
к примеру, такой пример может вас завести очень далеко

Код: Выделить всё

function getsum: Double;
{
var Result: double;

   Result++;
   getsum := Result;
}

a := getsum; //скорее всего 1
a := getsum; //скорее всего 2
a := getsum; //скорее всего 3
...
[/code]

Добавлено: 06 июн 2008, 09:21
Ged
По первому проблема в ПИРе. Рассмотреть в планах будущих версий.

Добавлено: 06 июн 2008, 11:08
galover
Max_Fin
Где включить оптимизацию самому?
в каком месте f..g мануала про все особенности можно прочитать
Ged
Спасибо. Я тоже думаю что так быть не должно

Добавлено: 06 июн 2008, 12:01
galover
Вопрос в догонку, нет ли в ПИР-е предложения на поддержку перегруженных функций, так надоело писать всякие суффиксы Ex и Ex2.

Добавлено: 06 июн 2008, 14:14
edward_K
что-то было насчет перегрузки всего фейса - vipprogr посмотрите "Реализация объектных интерфейсов". Да и можно параметр предусмотреть заранее - для указания типа обработки - и по нему сделать ветвление в одной и той же функции.