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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Egor138
 Аватар для Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
27.08.2012, 01:39     Что то типа goto #1
Мне нужно что нибудь похожее на goto... Только мне нужно перескочить из функции в одном файле в функцию другого файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.08.2012, 02:05     Что то типа goto #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, вызвать её, а потом вернуться как обычно?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.08.2012, 07:29     Что то типа goto #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
понарассказывают, что так делать плохо
Почему же! Это прекрасно! Ведь костыли гораздо круче, чем нормальная архитектура приложения, правда ведь?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.08.2012, 07:48     Что то типа goto #4
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Может лучше объявить нужную функцию extern
Разве для прототипа функции нужен extern?
KostyaKulakov
Заблокирован
27.08.2012, 07:59     Что то типа goto #5
Цитата Сообщение от Deviaphan Посмотреть сообщение
Почему же! Это прекрасно! Ведь костыли гораздо круче, чем нормальная архитектура приложения, правда ведь?

Не по теме:

.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
27.08.2012, 08:12     Что то типа goto #6
Цитата Сообщение от Egor138 Посмотреть сообщение
Только мне нужно перескочить из функции в одном файле в функцию другого файла
никогда не делай этого (это так называемое "программирование спагетти")
этим нарушается один из главных принципов
"Один вход - один выход"
представь что произойдет если нужно будет поменять одну из функций
времена ловли байт уже прошли
просто скопируй из другой функции ту часть кода что нужна и вставь в первую(индийский метод "копи-пасте")
или что правильней выведи общий код в третью функцию и обращайся к ней из первых двух
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.08.2012, 08:34     Что то типа goto #7
Цитата Сообщение от ValeryS Посмотреть сообщение
этим нарушается один из главных принципов
"Один вход - один выход"
"Это С++, детка."(c)
throw
-=ЮрА=-
Заблокирован
Автор FAQ
27.08.2012, 09:05     Что то типа goto #8
Egor138, как вариант запускай thread-нить нужной функции (параллель работу). Хотя мне не понятно почему нельзя просто call-ом вызвать функцию 2 в теле функции 1 или мы лезем во внутренности процесса???
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.08.2012, 09:10     Что то типа goto #9
http://www.boost.org/doc/libs/1_51_0...tml/index.html
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
27.08.2012, 09:18     Что то типа goto #10
Цитата Сообщение от ValeryS Посмотреть сообщение
этим нарушается один из главных принципов
"Один вход - один выход"
Я помню нас на информатике в школе заставляли рисовать блок-схемы, и чтобы блок "Конец" всегда был один. Мол типа exit делаешь только в одном месте))
-=ЮрА=-
Заблокирован
Автор FAQ
27.08.2012, 10:55     Что то типа goto #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);
}
Миниатюры
Что то типа goto  
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.08.2012, 13:06     Что то типа goto #12
Цитата Сообщение от Deviaphan Посмотреть сообщение
Почему же! Это прекрасно! Ведь костыли гораздо круче, чем нормальная архитектура приложения, правда ведь?
Ну почему сразу костыли. Хорошо задокументированный костыль может быть полезен. Вызовы функций, switch, named break, исключения, потоки, некоторые итераторы — всё это основано на goto. Просто качественно ограничено от обезьян, спрятано под синтаксисом и даёт +2 мм к броне на ботинке.

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

Главная проблема с нелокальными переходами — это продолжение функции, в которую переход направлен. Ну вот прыгнули мы в func(), а что делать, когда мы выйдем оттуда?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.08.2012, 15:32     Что то типа goto #13
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
что делать, когда мы выйдем оттуда?
Вот потому разработчики и запретили переход по goto за пределы функции. Чтобы не создавать себе лишних проблем для решения.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2012, 15:42     Что то типа goto #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();
}
Catstail
Модератор
 Аватар для Catstail
21501 / 10254 / 1670
Регистрация: 12.02.2012
Сообщений: 17,139
27.08.2012, 16:33     Что то типа goto #15
Интересно, а для чего это может понадобиться... (В смысле перескок из одной функции в другую)?
-=ЮрА=-
27.08.2012, 16:39
  #16

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
Интересно, а для чего это может понадобиться... (В смысле перескок из одной функции в другую)?
- такое обычно делают когда хотят подменить функцию ядра либо функцию внутри процесса, другое дело что это не таким джампом делается так делается...

OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
27.08.2012, 17:30     Что то типа goto #17
Цитата Сообщение от Catstail Посмотреть сообщение
Интересно, а для чего это может понадобиться... (В смысле перескок из одной функции в другую)?

Не по теме:

Вот это и есть различие между инженером и учёным: вторые в принципе не задают этот вопрос.
Хотя, задают; но отрицательный ответ на него не является аргументом для того, чтобы забросить проблему.

-=ЮрА=-
Заблокирован
Автор FAQ
27.08.2012, 17:38     Что то типа goto #18

Не по теме:

~OhMyGodSoLong~, посмотри в интернете известную карикатуру - "чего хотел пользователь" и станет понятно что лучше оговорить на что нацелена задача т.к. можем получить то что на той карикатуре...



Добавлено через 2 минуты

Не по теме:

Вот ссылка чтобы не искал
http://www.qaclub-nn.org/wp-content/...05-08-2007.png

ValeryS
27.08.2012, 17:45
  #19

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
известную карикатуру - "чего хотел пользователь"
есть еще "если бы программисты строили дома"
http://www.xakep.ru/post/12860/

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2012, 17:46     Что то типа goto
Еще ссылки по теме:

C++ Объясните мне, что же такого плохого в goto?
Есть в Visual Studio 2013 что-то типа builder c++ 6 C++
C++ Goto

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

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
27.08.2012, 17:46     Что то типа goto
  #20

Не по теме:

Я в курсе о ней. Но решают задачи инженеры.

Yandex
Объявления
27.08.2012, 17:46     Что то типа goto
Ответ Создать тему
Опции темы

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