Перейти к содержанию
    

Реализация в C аналога try-throw-catch CPP

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

goto

 

Да ябы и рад, но стек мне такого не простит :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Данные, хранящиеся на стеках функций, сохранять не требуется.

Можно ли такой номер исполнить в C ?

Базовый С предусматривает setjump/longjump.

В f_level_0 фиксируете точку возврата посредством вызова setjump.

В функции f_level_2 вызовом longjump возвращаетесь в ранее фиксированную setjump-ом точку.

Процессор получает ранее сделанный слепок состояния основных регистров - учитывая набор того времени, к примеру сопроцессор был внешним, поэтому его состояние не фиксировалось.

Все что было в стеке и изменения ресурсов (резервирование памяти, открытие файлов и прочее) между прыжками будет потеряно.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Базовый С предусматривает setjump/longjump.

В f_level_0 фиксируете точку возврата посредством вызова setjump.

В функции f_level_2 вызовом longjump возвращаетесь в ранее фиксированную setjump-ом точку.

Процессор получает ранее сделанный слепок состояния основных регистров - учитывая набор того времени, к примеру сопроцессор был внешним, поэтому его состояние не фиксировалось.

Все что было в стеке и изменения ресурсов (резервирование памяти, открытие файлов и прочее) между прыжками будет потеряно.

Небольшое практическое дополнение к предыдущему ответу:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...