Страница 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
Если есть возможность, то лучше зарегистрировать "снаружи". Если нет - зарегистрирую сам.