Форум программистов, компьютерный форум CyberForum.ru

setjump/longjump - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ консольная программа секундомер с остановкой и снова запуском http://www.cyberforum.ru/cpp-beginners/thread778262.html
Здарова господа! Интересно от есть допустим функция секундомер, при запуске в консоли работает цикл while и с задержкой выводится число потом инкриминируется и следующее. Вопрос, а можно как нибудь сделать управление этой функцией допустим остановить, а затем снова запустить????? (функция - это метод обьекта, в котором сохраняется время отчитаное) Или то ко как то через потоки нужно????
C++ Функция что находит количество элементов массива помогите написать функцию getNumberOfItemsEqualToValues​​, что находит количество элементов массива, входящих в заданные значения. Функция принимает на вход массив целых items, его длину, массив заданных значений targetValues ​​и длину этого массива. функция возвращает количество элементов массива items, содержащиеся в массиве targetValues​​. Предположите, что значение в массиве targetValues... http://www.cyberforum.ru/cpp-beginners/thread778251.html
C++ Функция для нахождения количества элементов в бинарном дереве
Помогите написать функцию для нахождения количества элементов в бинарном дереве. реализуйте функцию итеративно и рекурсивно. #include <stack> class Node { public: int value; Node* left; Node* right; }; int count(Node tree) { ... } int main()
Бинарное дерево C++
Здравствуйте, очень нужна ваша помощь ... нужна программа для работы с бинарным деревом, а именно (создание , добавление элемента, удаление элемента и узла) Но есть особый принцип работы который я сейчас опишу Вот сначала имеем пустое дерево затем добавляем элемент в корень потом добавляем второй элемент ниже и перед тем как его разместить на дереве сравниваем его с верхним элементом если он...
C++ Рендеринг Flash своими силами http://www.cyberforum.ru/cpp-beginners/thread778222.html
Задумался о создании Flash GUI. Но вот ведь беда, Adobe не делится библиотеками воспроизведения ихнего .swf, а Autodesk зажала свой Scaleform. Все плохо, но еще ужасней то, что флешку желательно рендерить кроссплатформенно, что отметает ActiveX. Вот и встает вопрос, неужели разбирать бедную swf-шку вручную? Попробовал разобраться в спецификации SWF но там черт ногу сломит. Быть может у адобовцев...
C++ Удалить часть текста в круглых скобках В заданном тексте удалить часть текста, заключенную в круглые скобки (скобки не удалять). Не поможите? подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.02.2013, 20:34     setjump/longjump
Баловаться с #if в 34 строке (0 или 1).
C++
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <setjmp.h>
 
class RecurseGuard {
    int &token;
public:
    RecurseGuard(int &token)
      : token(token)
    {
        token++;
        std::cout << "> ";
        for (int i = 0; i < token; i++) {
            std::cout << ".";
        }
        std::cout << "\n";
    }
 
    ~RecurseGuard()
    {
        std::cout << "< ";
        for (int i = 0; i < token; i++) {
            std::cout << ".";
        }
        std::cout << "\n";
        token--;
    }
};
 
jmp_buf xen;
 
int fact(int n, int &token)
{
    RecurseGuard _(token);
#if 0
    if (n == 3) {
        longjmp(xen, 0);
    }
#endif
    if (n > 0) {
        return n * fact(n - 1, token);
    }
    else {
        return 1;
    }
}
 
int main()
{
    if (!setjmp(xen)) {
        int token = 0;
        std::cout << fact(10, token) << "\n";
    }
    else {
        std::cout << "Exception!\n";
    }
}
Добавлено через 7 минут
Ах да, как работать.

Шаг 1: #include <setjmp.h>

Шаг 2: Объявить где-то переменную типа jmp_buf. Сюда будет сохраняться стек, который нужен для переходов.

Шаг 3: Сохранить стек с помощью setjmp(переменная типа jmp_buf). setjmp возвращает 0, если она сохранила стек туда, и не 0, если это был переход сюда из-за longjmp.

Шаг 4: Где надо вызвать longjmp(переменная типа jmp_buf, какое-то значение). После этого будет выполнен переход (goto) туда, где setjmp() сохранила стек. setjmp() при этом вернёт то значение, которое было передано в longjmp() (если был ноль, то вернёт единичку). Дальше выполнение продолжается как ни в чём не бывало с того места, где стоит setjmp(). Если setjmp() вызывалась из какой-то функции, которая была вызвана откуда-то ещё, то все аргументы, локальные переменные и порядок возвратов из функций будет такой же, каким должен быть.

Идиома применения setjmp() — вон тот иф, где одна ветка соответствует продолжению исполнения, а другая — возврату по longjmp().

Ага, это что-то вроде исключений, только тормознутее и плевало на весь Си++ с его деструкторами, его исключениями и т. п.
 
Текущее время: 12:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru