реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Реализация в C аналога try-throw-catch CPP, Всплытие экспрессом
k155la3
сообщение Jul 23 2016, 16:09
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Есть ли метод эмуляции действий 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 ?

Сообщение отредактировал k155la3 - Jul 23 2016, 16:11
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 23 2016, 16:50
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



goto
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jul 23 2016, 17:06
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(ViKo @ Jul 23 2016, 19:50) *
goto


Да ябы и рад, но стек мне такого не простит sm.gif
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jul 23 2016, 17:28
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



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

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


Go to the top of the page
 
+Quote Post
nill
сообщение Jul 24 2016, 06:46
Сообщение #5


Частый гость
**

Группа: Validating
Сообщений: 124
Регистрация: 10-08-05
Пользователь №: 7 502



Небольшое практическое дополнение к предыдущему ответу:
www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jul 25 2016, 06:06
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(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)
...


Спасибо, то, что надо.

Сообщение отредактировал Herz - Sep 6 2016, 20:54
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 05:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016