Страница 1 из 1
					
				Баги, методы и скобки
				Добавлено: 21 май 2012, 15:56
				 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.
Итак, если у нас был метод, возвращающий ссылку на объект, и мы потом вдруг решили добавить к нему необязательный параметр, то во всём коде, который раньше использовал этот метод нужно будет проставить скобки ^^
 
			
					
				Re: Баги, методы и скобки
				Добавлено: 22 май 2012, 14:10
				 Screw
				Необязательны. Но допустимы. То есть, можно при вызове любой процедуры/функции, не принимающей параметров или принимающей только параметры по умолчанию, понаставить пустых скобок: "CallMeTender()".
А то, что в описанном случае скобки оказались обязательны - это есть невежливость компилятора, который мог бы проверить не только количество параметров, но и их флаги и не требовать скобки столь ревностно.
			 
			
					
				Re: Баги, методы и скобки
				Добавлено: 22 май 2012, 14:41
				 Robis
				Сделаю небольшое дополнение, не указал раньше... Ошибка обнаруживается в момент исполнения кода, компиляция проходит нормально.
			 
			
					
				Re: Баги, методы и скобки
				Добавлено: 22 май 2012, 16:00
				 edward_K
				скобки обязательны когда функция совпадает с переменной или с полем таблицы в запросе
типа Username это и функция и местами поле.
			 
			
					
				Re: Баги, методы и скобки
				Добавлено: 28 май 2012, 21:04
				 Screw
				Полный текст примера  и описание порядка действий для повторения проблемы - в студию, пожалуйста.
			 
			
					
				Re: Баги, методы и скобки
				Добавлено: 29 май 2012, 13:39
				 Robis
				Полный текст примера у меня описан в первом посте в теге 
Код: Выделить всё
Описание.
  У нас имеется метод, принимающий необязательный параметр и возвращающий какой-то объект. В моём примере это статический метод getUpAndSign() интерфейса Voice. Метод возвращает новый экземпляр ObjVoice.
  Т.е. чтобы вызвать метод voice объектного интерфейса ObjVoice я могу написать Voice::getUpAndSing().voice или Voice::getUpAndSing.voice. Т.к. заявлено, что скобки к методам необязательны.
Проблема: При выполнении кода в точке Voice::getUpAndSing.voice возникает исключение ExIfcBadCheckSum (ExRef) в то время как  Voice::getUpAndSing().voice работает нормально.
 
			
					
				Re: Баги, методы и скобки
				Добавлено: 29 май 2012, 13:51
				 Screw
				Спасибо за разъяснения. У меня не было возможности проверить приведённый пример. Теперь посмотрел на воспроизведение. Однозначно - в ПИР. 
Какой-то косяк с вычислением контрольных сумм для методов vip-интерфейсов - публичных, с параметрами по умолчанию. Характерно, что объектные интерфейсы этим не страдают: если перенести метод getUpAndSing в ObjVoice, ошибка не воспроизводится.
			 
			
					
				Re: Баги, методы и скобки
				Добавлено: 29 май 2012, 14:58
				 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.
 
			
					
				Re: Баги, методы и скобки
				Добавлено: 29 май 2012, 15:08
				 Robis
				И да.. 
Screw писал(а):Теперь посмотрел на воспроизведение. Однозначно - в ПИР.
Это значит мне куда-то писать письма, или вы сами порегаете?
 
			
					
				Re: Баги, методы и скобки
				Добавлено: 29 май 2012, 15:11
				 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.
 
			
					
				Re: Баги, методы и скобки
				Добавлено: 30 май 2012, 14:20
				 Screw
				Если есть возможность, то лучше зарегистрировать "снаружи". Если нет - зарегистрирую сам.