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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
#1

Что то типа goto - C++

27.08.2012, 01:39. Просмотров 1401. Ответов 22
Метки нет (Все метки)

Мне нужно что нибудь похожее на goto... Только мне нужно перескочить из функции в одном файле в функцию другого файла
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2012, 01:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что то типа goto (C++):

Как работать с поисковыми системами типа: Altavista, AOL, Canada, Goto, Go? - C++
Кто работал с поисковыми системами типа: Altavista, AOL, Canada, Goto, Go, ....?(писал что-нибудь(С++) ориентируясь на работу с ними) ...

Объясните мне, что же такого плохого в goto? - C++
Виталян, открой спойлер! #include <iostream> #include <ostream> using namespace std; int matrix, i, j, a, b, dlin, vis,...

Ошибка что то типа не объявленный идентификатор,и типа невозможно преобразовать CStringW в там что..то - C++
Даже не знаю как сказать... короче есть база а Access,которую я подключил к проекту MFC,и в этой базе всего одно поле с текстовым типом...

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа? - C++
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Возврат объекта шаблонного типа от типа Type из специализации шаблона метода от того же типа - C++
Доброго времени суток, пишу класс содержащий несколько std::set от разных типов, нужно сделать метод возвращающий указатель на нужное...

что то типа крестики нолики - C++
допустим : 1 2 3 такое а поле в как...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.08.2012, 02:05 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
(Сейчас сюда понабегут падаваны Дейкстры и вам понарассказывают, что так делать плохо.)

Это что-нибудь называется setjmp/longjmp. Но его слегка сложновато применять нормально; setcontext и компания круче, но они не везде есть.
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
#include <iostream>
#include <csetjmp>
 
static jmp_buf netherworld; // это опорная точка для телепортации в func2()
 
void func2()
{
  if (!setjmp(netherworld)) {
    std::cout << "cyno up\n";
    return;
  }
  else {
    // логика работы функции
    std::cout << "func2() executed\n";
  }
}
 
void func1()
{
  std::cout << "Inside func1()\n"
            << "Jump drive active\n";
  longjmp(netherworld, 1);
  std::cout << "func1() returns"; // никогда не вызовется
}
 
int main()
{
  func2(); // обязательно для инициализации опорной точки
  std::cout << "74% cap\n";
  func1();
  std::cout << "main is dead"; // приехали
}
Разнести по файлам только и буфер сделать extern. Главная проблема: надо оставить метку для перехода.

Подумайте, оно вам надо? Может лучше объявить нужную функцию extern, вызвать её, а потом вернуться как обычно?
3
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.08.2012, 07:29 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
понарассказывают, что так делать плохо
Почему же! Это прекрасно! Ведь костыли гораздо круче, чем нормальная архитектура приложения, правда ведь?
6
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.08.2012, 07:48 #4
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Может лучше объявить нужную функцию extern
Разве для прототипа функции нужен extern?
0
KostyaKulakov
Заблокирован
27.08.2012, 07:59 #5
Цитата Сообщение от Deviaphan Посмотреть сообщение
Почему же! Это прекрасно! Ведь костыли гораздо круче, чем нормальная архитектура приложения, правда ведь?

Не по теме:

.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
27.08.2012, 08:12 #6
Цитата Сообщение от Egor138 Посмотреть сообщение
Только мне нужно перескочить из функции в одном файле в функцию другого файла
никогда не делай этого (это так называемое "программирование спагетти")
этим нарушается один из главных принципов
"Один вход - один выход"
представь что произойдет если нужно будет поменять одну из функций
времена ловли байт уже прошли
просто скопируй из другой функции ту часть кода что нужна и вставь в первую(индийский метод "копи-пасте")
или что правильней выведи общий код в третью функцию и обращайся к ней из первых двух
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.08.2012, 08:34 #7
Цитата Сообщение от ValeryS Посмотреть сообщение
этим нарушается один из главных принципов
"Один вход - один выход"
"Это С++, детка."(c)
throw
0
-=ЮрА=-
Заблокирован
Автор FAQ
27.08.2012, 09:05 #8
Egor138, как вариант запускай thread-нить нужной функции (параллель работу). Хотя мне не понятно почему нельзя просто call-ом вызвать функцию 2 в теле функции 1 или мы лезем во внутренности процесса???
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.08.2012, 09:10 #9
http://www.boost.org/doc/libs/1_51_0...tml/index.html
0
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
27.08.2012, 09:18 #10
Цитата Сообщение от ValeryS Посмотреть сообщение
этим нарушается один из главных принципов
"Один вход - один выход"
Я помню нас на информатике в школе заставляли рисовать блок-схемы, и чтобы блок "Конец" всегда был один. Мол типа exit делаешь только в одном месте))
0
-=ЮрА=-
Заблокирован
Автор FAQ
27.08.2012, 10:55 #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Egor138, как вариант запускай thread-нить нужной функции (параллель работу).
- Ниже вариация на эту тему
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <vector>
#include <iostream>
#include <process.h>
#include <windows.h>
using namespace std;
 
typedef struct
{
    int ThreadNum;
    int CallFlag;
}THREAD_PARAMS;
 
class CThreadList
{
private :
    int iQUANT;
    int StopFlag;
    CRITICAL_SECTION cs;//Тут потоки будут хранить сови данные
    vector<THREAD_PARAMS> vec;//Вектор параметров потоков
    //Кто разбирается - поймёт, что за грабли тут обошёл
    static void ThreadStart(PVOID lpThis)
    {
        CThreadList * pThis = (CThreadList *)lpThis;
        int iThread = (pThis->GetThreadCount() - 1);
        pThis->ThreadProc(&iThread);
        _endthread();
    }
public :
    CThreadList()
    {
        StopFlag = 0;
        InitializeCriticalSection(&cs);
    }
    ~CThreadList()
    {
        SetStopFlag(1);//Устанавливаем флаг окнчания работы 
        Sleep(iQUANT);//Даём время нитям завершить свою работу
        DeleteCriticalSection(&cs);
    }
    
    void SetQUANT(int _iQUANT);
    void SetStopFlag(int _StopFlag);
    int  GetThreadCount();
    int  GetStopFlag();
    THREAD_PARAMS GetThreadParams(int iThread);
    void AddThread  ();
    void ThreadProc(PVOID lpParams);
    void CallThread(int iThread);
};
 
int main()
{
    int iChoise = 0;
    int iThread = -1;
    CThreadList pList;
    pList.SetQUANT(100);
    while(!pList.GetStopFlag())
    {
        cout<<"1  - ADD  THREAD\n";
        cout<<"2  - CALL THREAD\n";
        cout<<"0  - EXIT\n";
        cin>>iChoise;
        switch(iChoise)
        {
        case 0:
            pList.SetStopFlag(1);
            break;
        case 1:pList.AddThread();break;
        case 2:
            if(!pList.GetThreadCount())
                cout<<"Thread list is empty\n";
            else
            {
                if(iThread + 1 < pList.GetThreadCount())
                    iThread = iThread + 1;
                else
                    iThread = 0;
                pList.CallThread(iThread);
            }
            break;
        default:
            cout<<"Unsupported value\n";
            break;
        }
    }
    return 0;
}
 
void CThreadList::SetQUANT(int _iQUANT)
{
    EnterCriticalSection(&cs);
    iQUANT = _iQUANT;
    LeaveCriticalSection(&cs);
}
 
void CThreadList::SetStopFlag(int _StopFlag)
{
    EnterCriticalSection(&cs);
    StopFlag = _StopFlag;
    LeaveCriticalSection(&cs);
}
 
int CThreadList::GetThreadCount()
{
    return vec.size();
}
 
int CThreadList::GetStopFlag()
{
    return StopFlag;
}
 
THREAD_PARAMS CThreadList::GetThreadParams(int iThread)
{
    THREAD_PARAMS pParam = {0};
    pParam.ThreadNum     = -1;
    if(iThread < GetThreadCount())
        pParam = vec.at(iThread);
    return pParam;
}
 
void CThreadList::AddThread ()
{
    THREAD_PARAMS pParam = {0};
    pParam.ThreadNum = GetThreadCount();
    pParam.CallFlag  = 0;
    vec.push_back(pParam);
    _beginthread(ThreadStart,0, this);
}
 
void CThreadList::ThreadProc (PVOID lpParams)
{
    int iThread = *((int *)lpParams);
    while(!StopFlag)
    {
        EnterCriticalSection(&cs);
        if(vec.at(iThread).CallFlag)
        {
            vec.at(iThread).CallFlag = 0;
            cout<<"[Thread # "<<vec.at(iThread).ThreadNum<<" is Called]\n";
        }
        LeaveCriticalSection(&cs);
        if(!StopFlag)
            Sleep(iQUANT);
    }
}
 
void CThreadList::CallThread(int iThread)
{
    EnterCriticalSection(&cs);
    vec.at(iThread).CallFlag = 1;
    LeaveCriticalSection(&cs);
}
0
Миниатюры
Что то типа goto  
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.08.2012, 13:06 #12
Цитата Сообщение от Deviaphan Посмотреть сообщение
Почему же! Это прекрасно! Ведь костыли гораздо круче, чем нормальная архитектура приложения, правда ведь?
Ну почему сразу костыли. Хорошо задокументированный костыль может быть полезен. Вызовы функций, switch, named break, исключения, потоки, некоторые итераторы — всё это основано на goto. Просто качественно ограничено от обезьян, спрятано под синтаксисом и даёт +2 мм к броне на ботинке.

Так бы Егор вообще никогда не узнал бы, что так можно.

Главная проблема с нелокальными переходами — это продолжение функции, в которую переход направлен. Ну вот прыгнули мы в func(), а что делать, когда мы выйдем оттуда?
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.08.2012, 15:32 #13
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
что делать, когда мы выйдем оттуда?
Вот потому разработчики и запретили переход по goto за пределы функции. Чтобы не создавать себе лишних проблем для решения.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2012, 15:42 #14
Цитата Сообщение от Egor138 Посмотреть сообщение
Мне нужно что нибудь похожее на goto... Только мне нужно перескочить из функции в одном файле в функцию другого файла
без возврата назад? т.е. примерно так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo0(){
 if (dosomething()){
   //jump somehow out into foo1(). no return back here!
 } else {
  doJob();
 }
}
 
void foo1(){
 dododo();
 return;
entryForFoo0:
  dododododo();
}
0
Catstail
Модератор
22615 / 10976 / 1779
Регистрация: 12.02.2012
Сообщений: 18,117
27.08.2012, 16:33 #15
Интересно, а для чего это может понадобиться... (В смысле перескок из одной функции в другую)?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2012, 16:33
Привет! Вот еще темы с ответами:

что такое возможности типа Int? - C++
Здравствуйте, хм глупый вопрос скажите пожалуйста все возможности типа int языка с++:pardon:

На что влияет правильный выбор типа данных? - C++
Вопрос банальный. Предлагаю некий мозговой штурм. Сам не очень владею этой темой. Код работает с целыми числами. Для целых чисел в с++...

Есть в Visual Studio 2013 что-то типа builder c++ 6 - C++
Есть в Visual Studio 2013 что-то типа builder c++ 6 и стоит его учит или есть какие-то более популярен компилятьр за builder c++ 6

что плохого если я делаю ф-ю main типа void - C++
привет всем, кто может объяснить, что плохого если я делаю ф-ю main типа void ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.08.2012, 16:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru