Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Реализация в C аналога try-throw-catch CPP
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
k155la3
Есть ли метод эмуляции действий try-throw-catch (CPP)
для базового C ( IAR MSP430, в частности).

Есть цепочки вызовов функций
Код
line1:               f_level_0( f_level_1( f_level_2( f_levlel_3() ) ) )
line2:               a = a + 1;

(вызовы ф-ий в одну сторку и в качестве параметров - для сокращения)


Есть необходимость, находясь в ф-ии f_level_3(),
"бросить все", и минуя return в f_level_2(), f_level_1() начать выполнять программу
со строки line2:
Данные, хранящиеся на стеках функций, сохранять не требуется.

В CPP это решается просто, через try-throw-catch.
Можно ли такой номер исполнить в C ?
ViKo
goto
k155la3
Цитата(ViKo @ Jul 23 2016, 19:50) *
goto


Да ябы и рад, но стек мне такого не простит sm.gif
aiwa
Цитата(k155la3 @ Jul 23 2016, 19:09) *
Данные, хранящиеся на стеках функций, сохранять не требуется.
Можно ли такой номер исполнить в C ?

Базовый С предусматривает setjump/longjump.
В f_level_0 фиксируете точку возврата посредством вызова setjump.
В функции f_level_2 вызовом longjump возвращаетесь в ранее фиксированную setjump-ом точку.
Процессор получает ранее сделанный слепок состояния основных регистров - учитывая набор того времени, к примеру сопроцессор был внешним, поэтому его состояние не фиксировалось.
Все что было в стеке и изменения ресурсов (резервирование памяти, открытие файлов и прочее) между прыжками будет потеряно.


nill
Небольшое практическое дополнение к предыдущему ответу:
www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html
k155la3
Цитата(aiwa @ Jul 23 2016, 20:28) *
Базовый С предусматривает setjump/longjump.
В f_level_0 фиксируете точку возврата посредством вызова setjump.
В функции f_level_2 вызовом longjump возвращаетесь в ранее фиксированную setjump-ом точку.
Процессор получает ранее сделанный слепок состояния основных регистров - учитывая набор того времени, к примеру сопроцессор был внешним, поэтому его состояние не фиксировалось.
Все что было в стеке и изменения ресурсов (резервирование памяти, открытие файлов и прочее) между прыжками будет потеряно.

Цитата(nill @ Jul 24 2016, 09:46) *
Небольшое практическое дополнение к предыдущему ответу:
www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html

тут макросы для эмуляции
Код
...
#define TRY do{ jmp_buf ex_buf__; switch( setjmp(ex_buf__) ){ case 0: while(1){
#define CATCH(x) break; case x:
#define FINALLY break; } default: {
#define ETRY break; } } }while(0)
#define THROW(x) longjmp(ex_buf__, x)
...


Спасибо, то, что надо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.