picc18, "recursive function calls:", нет рекурсии, нет.

Aug 31, 2006 2 Replies

Компилятор выдаёт сабжевое сообщение. Он в чём-то прав, а именно: в данном случае рекурсивный вызов *может быть совершён*, а может и не быть. Логика работы функции такова, что гарантируется, что никаких рекурсий быть не может. Нет, всё не так. НА самом деле функций две и каждая *может* (но не факт что будет) вызывать другую. Логика работы программы не позволяет повторный вызов любой из функций. Но компилятор этого не знает и выдаёт ошибку.



Вопрос: как бы заткнуть это сообщение об ошибке? Генерируемый код меня вполне устраивает. Работать будет.


Решение:

  1. Заменяем вызовы function() на pointer_to_function().
  2. Пишем в main: pointer_to_function = function.
  3. Компилируем -- хрен. И как не извращайся с адресом -- тоже хрен.
  4. Меняем тип pointer_to_function. Т.е. вначале он был как у функции, например void f(enum x). Меняем char f(enum x). На код это мало повлияет.
  5. Ура, заработало! Компилятор мы успешно обманули.

 X-Virus-Scanned: amavisd-new at bezeqint.net

Hello, Kirill Frolov! You wrote in conference fido7.ru.embedded on Thu, 31 Aug 2006 08:29:51

+0000 (UTC):

KF> Компилятор выдаёт сабжевое сообщение. Он в чём-то прав, а именно: KF> в данном случае рекурсивный вызов *может быть совершён*, а может и KF> не быть. Логика работы функции такова, что гарантируется, что KF> никаких рекурсий быть не может. Нет, всё не так. НА самом деле KF> функций две и каждая *может* (но не факт что будет) вызывать другую. KF> Логика работы программы не позволяет повторный вызов любой из KF> функций. Но компилятор этого не знает и выдаёт ошибку.

KF> Вопрос: как бы заткнуть это сообщение об ошибке? Генерируемый код KF> меня вполне устраивает. Работать будет.

Объяви локальные переменные статическими (они все равно статические, только перекрываемые) и ошибки не будет.

dima

formatting link

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required