Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
Сразу прошу, не ругайтесь. Я знаю как работать с try / catch, но начинал сразу с С++. Я так понимаю, что setjmp - аналог try, и заодно в какое место будет catch (если не прав - поправьте), а longjmp - аналог throw. Если у кого-нибудь есть ссылка на учебник, или хоть какой-нибудь образец для такого дурачка как я, пожалуйста ответьте. Заранее спасибо. (Про SEH я знаю, но в своей практике не сталкивался). P.S. Столкнулся с настолько древним кодом, что чуть ли не Fortran 77 пришлось вспоминать, а я уже лет 8 не программист. Решений не прошу, пните в какую сторону копать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 14:56 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
Dubrov_AE, вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 15:26 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
Я тоже не понял о каком учебнике идет речь. Надо уточнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 16:55 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
Dubrov_AEпните в какую сторону копать. в гугл копать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 17:06 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
Dubrov_AEЯ так понимаю, что setjmp - аналог try, и заодно в какое место будет catch (если не прав - поправьте), а longjmp - аналог throw. Вобщем, да, но это средство более низкоуровневое и менее удобное. Тебе нужно только понять , как работает код , или писать свой ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2016, 17:58 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
Dubrov_AEЯ так понимаю, что setjmp - аналог try, и заодно в какое место будет catch (если не прав - поправьте), а longjmp - аналог throw.Да. Dubrov_AEЕсли у кого-нибудь есть ссылка на учебник,Есть справочники: setjmp / longjmp на cplusplus.com setjmp / longjmp на cppreference.com Dubrov_AEили хоть какой-нибудь образец Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. Вывод на консоль: Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 03:45 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
Dubrov_AEЯ так понимаю, что setjmp - аналог try, и заодно в какое место будет catch (если не прав - поправьте), а longjmp - аналог throw.Ни разу не аналоги. Если бы setjump/longjump позволяли вызывать деструкторы в процессе раскручивания стека - никто бы не стал заморачиваться на try/catch. Но try/catch - появились. Вместе с присущими им проблемами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 08:40 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
да, меня тоже заинтересовал этот вопрос. как освобождать захваченные ресурсы (в фунции которая делает вызов longjmp понятно, а в функциях выше по стеку)? никак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 10:42 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
вы в первую очередь разберитесь зачем у вас они используются в том смысле что на lonjmp могут не эмулироваться исключения либо сопрограммы или какой-то вид кооперативной многозадачности, а просто выход с фатальной ошибкой, тогда и разбиратся в этом особо не нужно в некоторых старых проектах так и делали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 13:39 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovDubrov_AEЯ так понимаю, что setjmp - аналог try, и заодно в какое место будет catch (если не прав - поправьте), а longjmp - аналог throw.Ни разу не аналоги. Если бы setjump/longjump позволяли вызывать деструкторы в процессе раскручивания стека - никто бы не стал заморачиваться на try/catch. Но try/catch - появились. Вместе с присущими им проблемами. 1. Ну я же утрировал. Дело в том что код настолько древний, что ООП там и не пахло, а я как-то мимо чистого С проскочил, а потом программированием очень долго не занимался. 2. И большое спасибо Петру Седову, теперь кажется начал понимать что к чему. 3. Большое спасибо всем кто откликнулся. --- С уважением, Dubrov. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 14:19 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovЕсли бы setjump/longjump позволяли вызывать деструкторы в процессе раскручивания стека -Это зависит от компилятора. Visual C++, при определённых настройках, вызывает деструкторы локальных C++-объектов при передаче управления longjmp → setjmp: // https://msdn.microsoft.com/en-us/library/yz2ez4as(v=vs.140).aspx Using setjmp/longjmp Visual Studio 2015 ... If you decide to use setjmp/longjmp in a C++ program, also include SETJMP.H or SETJMPEX.H to assure correct interaction between the functions and C++ exception handling. If you use /EH to compile, destructors for local objects are called during the stack unwind.При таком раскладе, longjmp -- это аналог throw. Basil A. Sidorovникто бы не стал заморачиваться на try/catch. Но try/catch - появились.В C++, такое дублирование функционала -- обычное дело: * указатели (int*) и ссылки (int&) * setjmp/longjmp и try/throw/catch * malloc/free и new/delete * stdio и iostreams * qsort и std::sort alexy_blackкак освобождать захваченные ресурсы (в фунции которая делает вызов longjmp понятно, а в функциях выше по стеку)? никак?Да, кросс-платформенно и автоматически -- никак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2016, 23:54 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
http://boost.org/libs/fibers я как-то стал сделать такое же с помощью boost.context, потом обнаружил эту библиотку, использую уже год в своем проекте (она тогда еще в буст не входила). очень удобно для неблокирующей архитектуры. фибры хороши еще и тем, что переключение происходит только тогда, когда оно действительно нужно. то есть можно даже не загонятся с мутексами (хотя они там есть, специальные для фибр). вообще говоря, мне нравится си, но я часто отказываюсь от него в сторону плюсов из-за отсуствующей обработки ошибок - нужно всегда код возращать какой-нибудь или еще что-то в этом духе. меня это бесит. обрадовался, что есть такое решение, даже уже пошли мысли о проекте на си, но оказалось, оно не подходит. думаю тут если только складывать все ресурсы в кокой-нибудь глобальный стек, туда же класть и функции освобождения. очищаешь его, потом начинаешь действовать, потом вытаскиваешь полученные ресурсы и используешь, а если прилетело "исключение", то просто очищаешь и по новой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2016, 23:03 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
а, еще можно накрутить стек (local thread storage, в си есть такой?)с этими catch блоками. то есть кладешь на верхушку свой контекст (jmp_buf), потом вызываешь другие функции, они могут положить на верхушку свой.. если функция "бросает исключение" - она просто снимает с верхушки стека контекст и прыгает туда. если не можешь обработать - снимаешь следующий и прыгаешь туда. тогда вобще можно написать функции tipo_try, которая возращает код ошибки или ноль если не было (а контект кладет на стек трай блоков) и tipo_throw которая снимает со стека контекст и "бросает исключение" - переходит туда с кодом ошибки. tipo_throw может вызываешь аборт если стек пуст - необработаенное исключение :) вот такой полет фантазии :) а ну да, tipo_throw еще должна и очищать стек ресурсов.. этот стек русурсов можно подфигачить к контексту. то есть начал новый типо try блок - создал пустой стек контекстов, который будет очищет в момент типа исключения. функции очистки должны быть noexcpet - не имеют права вызывать функцию tipo_throw. о, какая-то обработка ошибок вырисовывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2016, 23:13 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
alexy_black, библиотека MFC когда-то давным давно предоставляла исключения, реализованные через setjmp/longjmp (на этом форуме про это только MasterZiv помнит ). Но я вам не советую идти по этому пути. Слишком сложно получится. Если уж решили писать на чистом C, то там обычно обработку ошибок делают кодами возврата, придётся попотеть. Хотя для консольных утилит часто подходит упрощённая обработка ошибок в стиле: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 05:10 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, попробовать интересно.. меня лично бесят эти коды ошибок, нужно после каждой функции делать if. а тут будет отличие только в том, что нужно захватывать ресурс определенным способом - создавать структурку и вызывать для неё функции, чтобы она подложила эту структурку в стек. возможно упростит код. но может быть конечно что и нет.. если создам таукю либу, отпишусь на форуме, посмотрите :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 21:29 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
alexy_blackменя лично бесят эти коды ошибок, нужно после каждой функции делать if если бесит - смените занятие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2016, 22:32 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
Пётр Седовalexy_black, библиотека MFC когда-то давным давно предоставляла исключения, реализованные через setjmp/longjmp (на этом форуме про это только MasterZiv помнит ). Но я вам не советую идти по этому пути. Слишком сложно получится. Если уж решили писать на чистом C, то там обычно обработку ошибок делают кодами возврата, придётся попотеть. Хотя для консольных утилит часто подходит упрощённая обработка ошибок в стиле: Код: plaintext 1. 2. 3. 4. 5. Да делают на С обработку ошибок на SETJUMP/LONGJUMP. Кто тебе сказал-то, что надо обязательно через коды возврата ? Код возврата применяют, когда внутри функции не понятно, допустима ли такая ситуация. Например, спецификация функции выглядит так: "Вот тебе строка, тут должен быть URI, выдели мне оттуда протокол и номер порта сервиса, если сможешь". В таком случае функция выделяет , записывает, и кодами возврата сообщает, какие данные были сформированы, а какие -- нет. В других же случаях применяют как коды возврата, так и SETJUMP/LONGJUMP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2016, 13:16 |
|
||
|
SetJmp / LongJmp
|
|||
|---|---|---|---|
|
#18+
MasterZivДа делают на С обработку ошибок на SETJUMP/LONGJUMP.Да, делают, но редко (судя по исходникам C-шных open-source-ных библиотек; я сходу могу вспомнить только libpng). Потому что в C нет простого удобного способа гарантированно освободить локальный ресурс, если кто-то вызвал longjmp: Код: plaintext 1. 2. 3. 4. 5. MasterZivКто тебе сказал-то, что надо обязательно через коды возврата ?Я такого не писал. Я по-другому писал: Пётр СедовЕсли уж решили писать на чистом C, то там обычно обработку ошибок делают кодами возврата, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2016, 02:50 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39375743&tid=2018336]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 277ms |
| total: | 424ms |

| 0 / 0 |
