Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
32 / 13 / 3
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
1

Что то типа goto

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

Мне нужно что нибудь похожее на goto... Только мне нужно перескочить из функции в одном файле в функцию другого файла
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2012, 01:39
Ответы с готовыми решениями:

Как работать с поисковыми системами типа: Altavista, AOL, Canada, Goto, Go?
Кто работал с поисковыми системами типа: Altavista, AOL, Canada, Goto, Go, ....?(писал...

Превращение кода с goto в код без goto
Помогите переписать это код без goto и потери производительности.А то мне кажется написано...

Объясните мне, что же такого плохого в goto?
Виталян, открой спойлер! #include <iostream> #include <ostream> using namespace std; int...

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

22
~ Эврика! ~
1254 / 1003 / 74
Регистрация: 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
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
27.08.2012, 07:29 3
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
понарассказывают, что так делать плохо
Почему же! Это прекрасно! Ведь костыли гораздо круче, чем нормальная архитектура приложения, правда ведь?
6
5478 / 4873 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.08.2012, 07:48 4
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Может лучше объявить нужную функцию extern
Разве для прототипа функции нужен extern?
0
Заблокирован
27.08.2012, 07:59 5
Цитата Сообщение от Deviaphan Посмотреть сообщение
Почему же! Это прекрасно! Ведь костыли гораздо круче, чем нормальная архитектура приложения, правда ведь?

Не по теме:

:D

.
0
Модератор
Эксперт по электронике
8333 / 6185 / 829
Регистрация: 14.02.2011
Сообщений: 21,482
27.08.2012, 08:12 6
Цитата Сообщение от Egor138 Посмотреть сообщение
Только мне нужно перескочить из функции в одном файле в функцию другого файла
никогда не делай этого (это так называемое "программирование спагетти")
этим нарушается один из главных принципов
"Один вход - один выход"
представь что произойдет если нужно будет поменять одну из функций
времена ловли байт уже прошли
просто скопируй из другой функции ту часть кода что нужна и вставь в первую(индийский метод "копи-пасте")
или что правильней выведи общий код в третью функцию и обращайся к ней из первых двух
0
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 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
В астрале
Эксперт С++
8030 / 4787 / 655
Регистрация: 24.06.2010
Сообщений: 10,558
27.08.2012, 09:10 9
http://www.boost.org/doc/libs/... index.html
0
87 / 87 / 1
Регистрация: 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  
~ Эврика! ~
1254 / 1003 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
27.08.2012, 13:06 12
Цитата Сообщение от Deviaphan Посмотреть сообщение
Почему же! Это прекрасно! Ведь костыли гораздо круче, чем нормальная архитектура приложения, правда ведь?
Ну почему сразу костыли. Хорошо задокументированный костыль может быть полезен. Вызовы функций, switch, named break, исключения, потоки, некоторые итераторы — всё это основано на goto. Просто качественно ограничено от обезьян, спрятано под синтаксисом и даёт +2 мм к броне на ботинке.

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

Главная проблема с нелокальными переходами — это продолжение функции, в которую переход направлен. Ну вот прыгнули мы в func(), а что делать, когда мы выйдем оттуда?
0
Делаю внезапно и красиво
Эксперт С++
1310 / 1225 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
27.08.2012, 15:32 13
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
что делать, когда мы выйдем оттуда?
Вот потому разработчики и запретили переход по goto за пределы функции. Чтобы не создавать себе лишних проблем для решения.
0
554 / 508 / 25
Регистрация: 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
Модератор
Эксперт Python
28038 / 14988 / 2955
Регистрация: 12.02.2012
Сообщений: 24,546
Записей в блоге: 4
27.08.2012, 16:33 15
Интересно, а для чего это может понадобиться... (В смысле перескок из одной функции в другую)?
0
-=ЮрА=-
27.08.2012, 16:39
  #16

Не по теме:

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

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

Не по теме:

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

1
Заблокирован
Автор FAQ
27.08.2012, 17:38 18

Не по теме:

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



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

Не по теме:

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

1
ValeryS
27.08.2012, 17:45
  #19

Не по теме:

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

1
OhMyGodSoLong
27.08.2012, 17:46     Что то типа goto
  #20

Не по теме:

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

1
27.08.2012, 17:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2012, 17:46
Привет! Вот еще темы с ответами:

Есть ли в Builder то-то типа goto?
Помню, когда в бейсике ещё в школе программировали та была такая штука: goto А в билдере есть...

Как сделать что бы в listbox было типа заголовков, а в ValueListEditor содержание(что то типа бд)
Как сделать что бы в listbox было типа заголовков, а в ValueListEditor содержание?

За что так не любят Goto?
Может я такой непонятливый, но объясните кто может - почему у многих не самое чучшее отношение к...

Не получается сделать без goto. Знаю, что можна циклом while и еще использовать break
#include&lt;stdio.h&gt; #include&lt;math.h&gt; int main(void) { int n, a, b, c, d; label:...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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