Проблема с возвратом значения функции

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

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

Ответить
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Проблема с возвратом значения функции

Сообщение KATZ »

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

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

function f1(...): boolean;
...
f1:=true;
Message(String(f1), 0);
end;

function f2(...): boolean;
...
f2:=f1(...);
if (f2)  Message('Всё хорошо', 0);
else  Message('Всё плохо', 0);
...
end;
Казалось бы, если первое сообщение "TRUE", то за ним должно идти "Всё хорошо". Ан нет, после "TRUE" идёт "Всё плохо"!

Код был написан очень давно, работал без нареканий. Когда неожиданно перестал, причину пришлось искать долго. Тупо смотрел на эти несколько строк, пытался понять, где же я накосячил, и в упор не видел ничего проблемного. Понял, что накосячил не я, только когда навставлял отладочных сообщений. В итоге пришлось первую функцию трансформировать в процедуру, которая пишет свой результат в глобальную переменную, а вторая функция, соответственно, оттуда его читает. Таким образом, проблему удалось не то чтобы решить, но обойти. Теперь вот думаю: то ли глобально искать и чистить в своём коде все похожие места, то ли проблема всё-таки разовая и вызвана неудачным сочетанием каких-то факторов.

Надеюсь, кому-нибудь моё повествование сэкономит время и нервы.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Проблема с возвратом значения функции

Сообщение Den »

У меня стоят обновление от середины июня. Код :

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

Interface TestFun1;
 create view
 ;

 Function F1(p1: word) : boolean ;
 {
  Result:=(p1=1);
 }

 Function F2(p1: word) : boolean ;
 {
  Result:=F1(p1);
  if Result Message('is True');
  else Message('is False');
 }

 HandleEvent

  CmInit:{
           if F2(word(1)) {}
           if F2(word(0)) {}
         }
 End;
end.

дает тока 'is True'
Но вообще то терминатором ; должна оканчиваться вся логическая конструкция

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

 if Result Message('is True')
  else Message('is False');
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Проблема с возвратом значения функции

Сообщение KATZ »

Den писал(а):Но вообще то терминатором ; должна оканчиваться вся логическая конструкция
Это по правилам паскаля. Я привык на си писать, там перед else нужна точка с запятой, VIP такое нормально воспринимает.

З. Ы. Заглянул в документацию "Описание языка VIP" -- "Операторы" -- "Условный оператор if". Там пример использования, в нём стоит ; перед else. Так что дело не в её наличии/отсутствии.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Проблема с возвратом значения функции

Сообщение Den »

Да, был не прав. В доке действительно заявлено что работать должно так и так.
KATZ, а у вас мой пример тоже работает с неправильным эффектом ?
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Проблема с возвратом значения функции

Сообщение KATZ »

Ваш пример нормально работает.
LaaLaa

Re: Проблема с возвратом значения функции

Сообщение LaaLaa »

При присвоении результата функции лучше пользовать ключевое слово result а не имя функции


И еще попробуйте ваши коды скомпилировать с опцией StrictVip=on и привести свой код к такому виду чтобы влоге компилятора небыло warnig
Ответить