Баги, методы и скобки

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Баги, методы и скобки

Сообщение Robis »

Обязательны или не обязательны скобки при использовании методов в VIP?

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

ObjInterface ObjVoice;

  function voice(): void;

end;

VipInterface Voice Implements ObjVoice licensed(Free);
public:
  static: function getUpAndSing(a: word = 3): ObjVoice;
end;

Interface Voice;

  function getUpAndSing(a: word = 3): ObjVoice;
    {
      var oi_result : ObjVoice(Voice) new;
      result := oi_result;
    }

  function ObjVoice.voice(): void;
    {
      message('!');
    }

end.

Interface test;

  handleEvent

    cmInit:
      {

      Voice::getUpAndSing().voice; // ОК
      Voice::getUpAndSing.voice; // <- ExIfcBadCheckSum (ExRef) в EPA_TEST::Voice несовпадение контрольной суммы ObjInterface ( 1 )

      }

  end;

end.
Итак, если у нас был метод, возвращающий ссылку на объект, и мы потом вдруг решили добавить к нему необязательный параметр, то во всём коде, который раньше использовал этот метод нужно будет проставить скобки ^^
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Re: Баги, методы и скобки

Сообщение Screw »

Необязательны. Но допустимы. То есть, можно при вызове любой процедуры/функции, не принимающей параметров или принимающей только параметры по умолчанию, понаставить пустых скобок: "CallMeTender()".
А то, что в описанном случае скобки оказались обязательны - это есть невежливость компилятора, который мог бы проверить не только количество параметров, но и их флаги и не требовать скобки столь ревностно.
Виталий
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Re: Баги, методы и скобки

Сообщение Robis »

Сделаю небольшое дополнение, не указал раньше... Ошибка обнаруживается в момент исполнения кода, компиляция проходит нормально.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Баги, методы и скобки

Сообщение edward_K »

скобки обязательны когда функция совпадает с переменной или с полем таблицы в запросе
типа Username это и функция и местами поле.
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Re: Баги, методы и скобки

Сообщение Screw »

Полный текст примера и описание порядка действий для повторения проблемы - в студию, пожалуйста.
Виталий
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Re: Баги, методы и скобки

Сообщение Robis »

Полный текст примера у меня описан в первом посте в теге

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


Описание.

  У нас имеется метод, принимающий необязательный параметр и возвращающий какой-то объект. В моём примере это статический метод getUpAndSign() интерфейса Voice. Метод возвращает новый экземпляр ObjVoice.

  Т.е. чтобы вызвать метод voice объектного интерфейса ObjVoice я могу написать Voice::getUpAndSing().voice или Voice::getUpAndSing.voice. Т.к. заявлено, что скобки к методам необязательны.

Проблема: При выполнении кода в точке Voice::getUpAndSing.voice возникает исключение ExIfcBadCheckSum (ExRef) в то время как  Voice::getUpAndSing().voice работает нормально.
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Re: Баги, методы и скобки

Сообщение Screw »

Спасибо за разъяснения. У меня не было возможности проверить приведённый пример. Теперь посмотрел на воспроизведение. Однозначно - в ПИР.
Какой-то косяк с вычислением контрольных сумм для методов vip-интерфейсов - публичных, с параметрами по умолчанию. Характерно, что объектные интерфейсы этим не страдают: если перенести метод getUpAndSing в ObjVoice, ошибка не воспроизводится.
Виталий
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Re: Баги, методы и скобки

Сообщение Robis »

Screw, объектные фейсы страдают так же.. Вот переделанный пример, который это демонстрирует. ))

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

ObjInterface ObjVoice;
  function voice(): void;
end;

ObjInterface ObjVoiceFactory;
  function getUpAndSing(a: word = 3): ObjVoice;
end;

VipInterface Voice Implements ObjVoice, ObjVoiceFactory licensed(Free);
Interface Voice;

  function ObjVoiceFactory.getUpAndSing(a: word = 3): ObjVoice;
    {
      var oi_result : ObjVoice(Voice) new;
      result := oi_result;
    }

  function ObjVoice.voice(): void;
    {
      message('!');
    }

end.

Interface test;

  handleEvent

    cmInit:
      {

      var oi_factory: ObjVoiceFactory(Voice);

      oi_factory.getUpAndSing().voice;
      oi_factory.getUpAndSing().voice;
      oi_factory.getUpAndSing.voice;

      }

  end;

end.
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Re: Баги, методы и скобки

Сообщение Robis »

И да..
Screw писал(а):Теперь посмотрел на воспроизведение. Однозначно - в ПИР.
Это значит мне куда-то писать письма, или вы сами порегаете?
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Re: Баги, методы и скобки

Сообщение Robis »

А вот если этот метод вынести в этот же объектный фейс, тогда да. Тогда всё работает.

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

ObjInterface ObjVoice;
  function voice(): void;
  function getUpAndSing(a: word = 3): ObjVoice;
end;

/*ObjInterface ObjVoiceFactory;
  function getUpAndSing(a: word = 3): ObjVoice;
end;                  */

VipInterface Voice Implements ObjVoice/*, ObjVoiceFactory*/ licensed(Free);
Interface Voice;

  function ObjVoice.getUpAndSing(a: word = 3): ObjVoice;
    {
      var oi_result : ObjVoice(Voice) new;
      result := oi_result;
    }

  function ObjVoice.voice(): void;
    {
      message('!');
    }

end.

Interface test;

  handleEvent

    cmInit:
      {

      var oi_factory: ObjVoice(Voice);

      oi_factory.getUpAndSing().voice;
      oi_factory.getUpAndSing().voice;
      oi_factory.getUpAndSing.voice;

      }

  end;

end.

Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Re: Баги, методы и скобки

Сообщение Screw »

Если есть возможность, то лучше зарегистрировать "снаружи". Если нет - зарегистрирую сам.
Виталий
Ответить