k155la3 26 23 июля, 2016 Опубликовано 23 июля, 2016 (изменено) · Жалоба Есть ли метод эмуляции действий 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 ? Изменено 23 июля, 2016 пользователем k155la3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 23 июля, 2016 Опубликовано 23 июля, 2016 · Жалоба goto Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 23 июля, 2016 Опубликовано 23 июля, 2016 · Жалоба goto Да ябы и рад, но стек мне такого не простит :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 23 июля, 2016 Опубликовано 23 июля, 2016 · Жалоба Данные, хранящиеся на стеках функций, сохранять не требуется. Можно ли такой номер исполнить в C ? Базовый С предусматривает setjump/longjump. В f_level_0 фиксируете точку возврата посредством вызова setjump. В функции f_level_2 вызовом longjump возвращаетесь в ранее фиксированную setjump-ом точку. Процессор получает ранее сделанный слепок состояния основных регистров - учитывая набор того времени, к примеру сопроцессор был внешним, поэтому его состояние не фиксировалось. Все что было в стеке и изменения ресурсов (резервирование памяти, открытие файлов и прочее) между прыжками будет потеряно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость nill 24 июля, 2016 Опубликовано 24 июля, 2016 · Жалоба Небольшое практическое дополнение к предыдущему ответу: www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 25 июля, 2016 Опубликовано 25 июля, 2016 (изменено) · Жалоба Базовый С предусматривает 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) ... Спасибо, то, что надо. Изменено 6 сентября, 2016 пользователем Herz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться