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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
#1

Проблема при вызове функции - C++

03.11.2011, 21:36. Просмотров 1607. Ответов 31
Метки нет (Все метки)

Написал для себя простенькую напоминалку, выводящую указанное сообщение через определённый промежуток времени(ну там, "отойди от компа, глаза разомни"))) и тп). И всё бы работает нормально, но вот как только происходит вызов функции change(), для изменения начальных параметров, происходит что-то странное - ничего не считывается с клавиатуры и консоль будто подвисает...
В общем прошу совета, что нужно исправить чтобы избежать данного бага?
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
// timet.cpp : Defines the entry point for the console application.
//
 
#include <iostream>
#include <cstdio>
#include <windows.h>
#include <conio.h>
 
using namespace std;
 
wchar_t text[10001];
char ch1, ch2, ch3, ch4;
 
unsigned long n;
int a, b;
 
int change();
 
int main()
{
    locale::global(locale("russian_Russia.866"));
 
    wcout << L"------------------------------------------" << endl;
    wcout << L"|Программа для автоматических напоминаний|" << endl;
    wcout << L"------------------------------------------" << endl << endl;
 
    do
    {
        wcout << L"Введите ваше напоминание(максимальная длина 10000 символов!):" << endl;
        wcin.getline(text, 10001);
        cout << endl;
        wcout << L"Если вы правильно ввели напоминание нижмите \"1\",\nдля повторного ввода - любую другую клавишу." << endl;
        ch1 = _getch();
        system("cls");
    }
    while (ch1 != '1');
 
    do
    {
        system("cls");
        wcout << L"Ввод частоты напоминаний: \n1)В секундах\n2)В минутах\n3)В часах" << endl;
        ch2 = _getch();
    }
    while (ch2 != '1' && ch2 != '2' && ch2 != '3');
 
    wcout << endl;
 
    switch (ch2)
    {
    case '1': 
        {
            wcout << L"Выбран пункт \"1\" - введите интервал в секундах: ";
            cin >> n;
            n *= 1000;
            break;
        }
    case '2': 
        {
            wcout << L"Выбран пункт \"2\" - введите интервал в минутах: ";
            cin >> n;
            n *= 60000;
            break;
        }
    case '3': 
        {
            wcout << L"Выбран пункт \"3\" - введитеи интервал в часах: ";
            cin >> n;
            n *= 3600000;
            break;
        }
    }
 
    wcout << L"Ok!;)";
    Sleep(3000);
 
    FreeConsole();
 
    do
    {
        Sleep(n);
        a = MessageBoxW(NULL, text, L"Напоминание!", MB_RETRYCANCEL|MB_ICONWARNING|MB_DEFBUTTON1 );
        if (a != 2) b = change();
    }
    while(a != 2);
 
return 0;
}
 
int change()
{
 
    ch1 = ch2 = ch3 = ch4 = 0;
    n = 0;
    a = b = 0;
 
    AllocConsole();
    do
    {
        system("cls");
        wcout << L"Продолжить напоминанать \"" << text << "\"?" << endl;
        wcout << L"1) Да, продолжить." << endl;
        wcout << L"2) Нет, сменить напоминание и интервал." << endl;
        wcout << L"3) Нет, завершить программу." << endl;
    } 
    while (ch4 != '1' && ch4 != '2' && ch4 != '3');
    switch (ch4)
    {
    case '1': 
        {
            wcout << L"Выбран пункт \"1\" - продолжаю... ";
            Sleep(2000);
            return 1;
            break;
        }
    case '2': 
        {
            wcout << L"Выбран пункт \"2\" - смена напоминания и интервала его отображения. ";
            do
            {
                wcout << L"Введите ваше напоминание(максимальная длина 10000 символов!):" << endl;
                wcin.getline(text, 10001);
                cout << endl;
                wcout << L"Если вы правильно ввели напоминание нижмите \"д\",\nдля повторного ввода - любую другую клавишу." << endl;
                ch1 = _getch();
                system("cls");
            }
            while (ch1 != '1');
 
            do
            {
                system("cls");
                wcout << L"Ввод частоты напоминаний: \nа)В секундах\nб)В минутах\nв)В часах" << endl;
                ch2 = _getch();
            }
            while (ch2 != '1' && ch2 != '2' && ch2 != '3');
            
            wcout << endl;
            
            switch (ch2)
            {
            case '1': 
                {
                    wcout << L"Выбран пункт \"1\" - введите интервал в секундах: ";
                    cin >> n;
                    n *= 1000;
                    break;
                }
            case '2': 
                {
                    wcout << L"Выбран пункт \"2\" - введите интервал в минутах: ";
                    cin >> n;
                    n *= 60000;
                    break;
                }
            case '3': 
                {
                    wcout << L"Выбран пункт \"3\" - введитеи интервал в часах: ";
                    cin >> n;
                    n *= 3600000;
                    break;
                }
            }
            break;
            return 2;
        }
    case '3': 
        {
            exit(0);
            break;
        }
    }
    return 0;
    FreeConsole();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2011, 21:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблема при вызове функции (C++):

Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов - C++
Добрый вечер всем! При изучении и написании работы столкнулся с ошибкой от которой не могу избавиться. (Т.к. очень сильно плаваю в ООП)....

Ошибка при вызове функции - C++
Добрый день! Есть функция по расчету детерминанта int _det(int size,double **arr,double &amp;det) { int i,j,k; det=1; double b; ...

Ошибка при вызове функции - C++
Ошибка в строке 90, при пошаговом выполнении она появляется при вызове функции, до захода в нее, хотя список сформирован правильно, т.к. до...

Ошибка при вызове функции - C++
В функции NewWords вызывается функция correct,при отладке я не могу войти в эту функцию,к тому же потом не выводится элементы объекта...

Переменные передаваемые при вызове функции - C++
Не умею передавать значения переменных при вызове функции, кто бы смог подсказать как передать значения &quot;float v&quot; и &quot;countY&quot; в выражениях...

GCC ошибка при вызове функции - C++
Здравствуйте. Проблема в следующем: при вызове функции sub из тела add выдается ошибка. http://puu.sh/3bFZj.png Путем экспериментов...

31
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2011, 14:59 #16

Не по теме:

Цитата Сообщение от kazak Посмотреть сообщение
Чем же вас CharToOem не устраивает?
-тем что требует буфера для строки, а перегрузкой сразу выводить символы можно



Цитата Сообщение от Whiteha Посмотреть сообщение
(с NULL не так?)...
- потому что с NULL у вас меседж бокс не привязан к конкретному окну, чрез его дескриптор и можите свободно под меседж бокс в главное окно нырнуть, с дескриптором меседж бокс перекрывает доступ к основному окну в этом всё различие

Цитата Сообщение от Whiteha Посмотреть сообщение
P.S. -=ЮрА=-, если если есть замечания к коду говорите сразу!
- вы оставили свой код, на мой как бы наплевали, и паяете с whar поэтому мне не охота биться головой об стену, за _getch я вам выше писал писал, но вы этого не восприняли...
0
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
05.11.2011, 17:20  [ТС] #17
-=ЮрА=-, я же вам написал, что ваш код у меня пошёл некорректно, более того, код который выложен у меня в первом посте - лишь часть программы, выложенная по той причине, что именно там проявляется ошибка. Поэтому я не могу тупо скопипастить ваш код и сидеть довольный(но опять же в вашей версии у меня проблемы с кодировками).
Из вашего кода я не понял как вы побороли проблему с _getch()'ем, неужели только заменой wcin на cin???
Ваше пояснение, что _getch() проскакивает из за трабл с буффером я понял, это логично и очевидно, но это не отвечает на поставленные вопросы:
1) Из-за чего же _getch() игнорится?(Вы ответели) Почему тогда не помогают ни wcin.sync(), ни wcin.ignore(), ни wcin.sync_with_stdio();(Нет ответа)
2) Как это предвидеть и избежать?(Нет ответа)
3) Как это лечить, если не получается избежать?(Нет ответа)
P.S. Не нужно переписывать мой код, если можете - просто поясните ответы на эти вопросы - это будет исчерпывающая помощь.

Добавлено через 2 часа 9 минут
UP, Неужели этот вопрос настолько трудный для большинства форумчан?=\
P.S. Я ставлю "спасибо" всем, кто даёт нужные ответы на поставленные вопросы.
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2011, 18:58 #18
Цитата Сообщение от Whiteha Посмотреть сообщение
Не нужно переписывать мой код, если можете - просто поясните ответы на эти вопросы - это будет исчерпывающая помощь.
- Хорошо!
Цитата Сообщение от Whiteha Посмотреть сообщение
P.S. Я ставлю "спасибо" всем, кто даёт нужные ответы на поставленные вопросы.
- по крайней мере у меня не біло бесконечного цикла wcin.ignore(); ПЕРЕД ch4 = _getch();

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int change()
{
        char ch1, ch2, ch4;
        ch1 = ch2 = ch4 = '\0';
 
        do
        {
                //system("cls");
                wcout << L"Продолжить напоминать \"" << text << "\"?" << endl;
                wcout << L"1) Да, продолжить." << endl;
                wcout << L"2) Нет, сменить напоминание и интервал." << endl;
                wcout << L"3) Нет, завершить программу." << endl;
                wcin.ignore();
                ch4 = _getch();
                //getchar();
                //cin >> ch4;
        }
1
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2011, 19:06 #19
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include <iostream>
#include <cstdio>
#include <windows.h>
#include <conio.h>
 
using namespace std;
 
wchar_t text[10001];
unsigned long n;
 
int change()
{
        char ch1, ch2, ch4;
        ch1 = ch2 = ch4 = '\0';
 
        do
        {
                //system("cls");
                wcout << L"Продолжить напоминать \"" << text << "\"?" << endl;
                wcout << L"1) Да, продолжить." << endl;
                wcout << L"2) Нет, сменить напоминание и интервал." << endl;
                wcout << L"3) Нет, завершить программу." << endl;
                wcin.ignore();
                ch4 = _getch();
                //getchar();
                //cin >> ch4;
        } 
        while (ch4 != '1' && ch4 != '2' && ch4 != '3');
 
        switch (ch4)
        {
        case '1': 
                {
                        wcout << L"Выбран пункт \"1\" - продолжаю... ";
                        Sleep(2000);
                        return 1;
                        break;
                }
        case '2': 
                {
                        wcout << L"Выбран пункт \"2\" - смена напоминания и интервала его отображения. " << endl;
                        do
                        {
                                wcout << L"Введите ваше напоминание(максимальная длина 10000 символов!):" << endl;
                                wcin.sync();
                                wcin.getline(text, 10001);
                                wcout << endl;
                                wcout << L"Если вы правильно ввели напоминание нижмите \"1\",\nдля повторного ввода - любую другую клавишу." << endl;
                                wcin.ignore();
                                ch1 = _getch();
                                //cin >> ch1;
                                system("cls");
                        }
                        while (ch1 != '1');
 
                        do
                        {
                                system("cls");
                                wcout << L"Ввод частоты напоминаний: \n1)В секундах\n2)В минутах\n3)В часах" << endl;
                                wcin.ignore();
                                ch2 = _getch();
                                //cin >> ch2;
                        }
                        while (ch2 != '1' && ch2 != '2' && ch2 != '3');
                        
                        wcout << endl;
                        
                        switch (ch2)
                        {
                        case '1': 
                                {
                                        wcout << L"Выбран пункт \"1\" - введите интервал в секундах: ";
                                        wcin >> n;
                                        n *= 1000;
                                        break;
                                }
                        case '2': 
                                {
                                        wcout << L"Выбран пункт \"2\" - введите интервал в минутах: ";
                                        wcin >> n;
                                        n *= 60000;
                                        break;
                                }
                        case '3': 
                                {
                                        wcout << L"Выбран пункт \"3\" - введитеи интервал в часах: ";
                                        wcin >> n;
                                        n *= 3600000;
                                        break;
                                }
                        }
                        break;
 
                        return 2;
                }
        case '3': 
                {
                        exit(0);
                        break;
                }
        }
        return 0;
}
 
int scen2()
{
        int a = 0;
        char ch1, ch2;
        ch1 = ch2 = '\0';
 
        do
        {
                wcout << L"Введите ваше напоминание(максимальная длина 10000 символов!):" << endl;
                wcin.getline(text, 10001);
                wcout << endl;
                wcout << L"Если вы правильно ввели напоминание нижмите \"1\",\nдля повторного ввода - любую другую клавишу." << endl;
                ch1 = _getch();
                system("cls");
        }
        while (ch1 != '1');
 
        do
        {
                system("cls");
                wcout << L"Ввод частоты напоминаний: \n1)В секундах\n2)В минутах\n3)В часах" << endl;
                ch2 = _getch();
        }
        while (ch2 != '1' && ch2 != '2' && ch2 != '3');
 
        wcout << endl;
 
        switch (ch2)
        {
        case '1': 
                {
                        wcout << L"Выбран пункт \"1\" - введите интервал в секундах: ";
                        wcin >> n;
                        n *= 1000;
                        break;
                }
        case '2': 
                {
                        wcout << L"Выбран пункт \"2\" - введите интервал в минутах: ";
                        wcin >> n;
                        n *= 60000;
                        break;
                }
        case '3': 
                {
                        wcout << L"Выбран пункт \"3\" - введите интервал в часах: ";
                        wcin >> n;
                        n *= 3600000;
                        break;
                }
        }
 
        wcout << L"Ok!;)";
 
 
           do
        {
                Sleep(n);
                a = MessageBoxW(GetForegroundWindow(), text, L"Напоминание!", MB_RETRYCANCEL | MB_ICONWARNING | MB_DEFBUTTON1);
                if (a != 2) 
                {
              
                        change();
                }
        }
        while(a != 2);
return 0;
}
 
int main()
{
    locale::global(locale("russian_Russia.866"));
 
        wcout << L"Укажите режим работы программы \"Напоминалка\":" << endl;
        wcout << L"1) Загрузить расписание из файла schedule.txt." << endl;
        wcout << L"2) Использовать одиночное напоминание." << endl;
        wcout << L"3) Комбинированный режим." << endl;
        wcout << L"4) Выход." << endl;
 
        char fl;
 
        do
        {
            fl = _getch();
        }
        while (fl != '1' && fl != '2' && fl != '3' && fl != '4');
 
        if (fl == '1')
        {
                //scen1();
                wcout << L"1 - В разработке..." << endl;
        }
        else if (fl == '2')
        {
                scen2(); //Написали, пытаемся разобраться с _getch()'ем
        }
        else if (fl == '3')
        {
                //scen3();
                wcout << L"3 - В разработке..." << endl;
        }
        else if (fl == '4')
        {
                exit(0);
        }
}
PS:Скрин после меседжбокса
1
Миниатюры
Проблема при вызове функции  
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
05.11.2011, 19:29  [ТС] #20
Спасибо, за то что всё таки продолжаете диалог, действительно при прописывание wcin.ignore(); там цикл перестаёт быть бесконечным, он выполняется два раза и на второй вроде бы даже ждёт считывания, но ничего не читает...=\

Добавлено через 8 минут
Стоп, беру свои слова обратно, ваша последняя версия рабочая...

Добавлено через 6 минут
Так, я понял что эта проблема связанна с AllocConsole() или FreeConsole(), если их добавить сюда:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 do
        {
                Sleep(n);
                a = MessageBoxW(GetForegroundWindow(), text, L"Напоминание!", MB_RETRYCANCEL | MB_ICONWARNING | MB_DEFBUTTON1);
                if (a != 2) 
                {
                    AllocConsole();
                    change();
                    FreeConsole();
 
                }
        }
        while(a != 2);
Возникает как раз проблема с циклом описанная мной выше, но они (AllocConsole() и FreeConsole()) нужны - как быть?
0
Миниатюры
Проблема при вызове функции  
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2011, 19:33 #21
Цитата Сообщение от Whiteha Посмотреть сообщение
с AllocConsole() или FreeConsole(), если их добавить сюда:
- а зачем их вводить вообще???
0
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
05.11.2011, 19:39  [ТС] #22
Чтобы консоль не нигде не висела, по идеи прога должна только в процессах отображаться.=\
До напоминания разумеется, когда напоминание выполнено появляется меню для вода дальнейших указаний.
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2011, 20:40 #23
Whiteha, не обижайтесь но чтобы скрить окно есть намного более привычные способы ShowWindow(hWnd,SW_HIDE);//скрыть
ShowWindow(hWnd,SW_SHOW);//показать

Своими AllocConsole() или FreeConsole() вы только консоли плодите

Не по теме:

Ложа руку на сердце скажу что алгортм у вас неоправданно раздутый, дайте задание что хотите реализвать, вы хоть и сказали за вас не писать но ваш код править устаёшь - говорю недочёт - в логике - что ж это программа 6 dowhile и прочих излишеств...

0
Миниатюры
Проблема при вызове функции  
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2011, 20:48 #24
Я подправил ваш код под мигание только меседж бокса и засвета консоли именно когда нужен вводНе поленитесь оттестируйте - будете приятно удивлены этим
C++
1
2
3
4
5
6
if (a != 2) 
{
      ShowWindow(hWnd,SW_SHOW);
      change();
      ShowWindow(hWnd,SW_HIDE);
}
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
#include <iostream>
#include <cstdio>
#include <windows.h>
#include <conio.h>
 
using namespace std;
 
wchar_t text[10001];
unsigned long n;
 
int change()
{
        char ch1, ch2, ch4;
        ch1 = ch2 = ch4 = '\0';
 
        do
        {
                //system("cls");
                wcout << L"Продолжить напоминать \"" << text << "\"?" << endl;
                wcout << L"1) Да, продолжить." << endl;
                wcout << L"2) Нет, сменить напоминание и интервал." << endl;
                wcout << L"3) Нет, завершить программу." << endl;
                                wcin.ignore();
                ch4 = _getch();
                //getchar();
                //cin >> ch4;
        } 
        while (ch4 != '1' && ch4 != '2' && ch4 != '3');
 
        switch (ch4)
        {
        case '1': 
                {
                        wcout << L"Выбран пункт \"1\" - продолжаю... ";
                        Sleep(2000);
                        return 1;
                        break;
                }
        case '2': 
                {
                        wcout << L"Выбран пункт \"2\" - смена напоминания и интервала его отображения. " << endl;
                        do
                        {
                                wcout << L"Введите ваше напоминание(максимальная длина 10000 символов!):" << endl;
                                wcin.sync();
                                wcin.getline(text, 10001);
                                wcout << endl;
                                wcout << L"Если вы правильно ввели напоминание нижмите \"1\",\nдля повторного ввода - любую другую клавишу." << endl;
                                wcin.ignore();
                                                                ch1 = _getch();
                                //cin >> ch1;
                                system("cls");
                        }
                        while (ch1 != '1');
 
                        do
                        {
                                system("cls");
                                wcout << L"Ввод частоты напоминаний: \n1)В секундах\n2)В минутах\n3)В часах" << endl;
                                wcin.ignore();
                                ch2 = _getch();
                                //cin >> ch2;
                        }
                        while (ch2 != '1' && ch2 != '2' && ch2 != '3');
                        
                        wcout << endl;
                        
                        switch (ch2)
                        {
                        case '1': 
                                {
                                        wcout << L"Выбран пункт \"1\" - введите интервал в секундах: ";
                                        wcin >> n;
                                        n *= 1000;
                                        break;
                                }
                        case '2': 
                                {
                                        wcout << L"Выбран пункт \"2\" - введите интервал в минутах: ";
                                        wcin >> n;
                                        n *= 60000;
                                        break;
                                }
                        case '3': 
                                {
                                        wcout << L"Выбран пункт \"3\" - введитеи интервал в часах: ";
                                        wcin >> n;
                                        n *= 3600000;
                                        break;
                                }
                        }
                        break;
 
                        return 2;
                }
        case '3': 
                {
                        exit(0);
                        break;
                }
        }
        return 0;
}
 
int scen2(HWND hWnd)
{
        int a = 0;
        char ch1, ch2;
        ch1 = ch2 = '\0';
 
        do
        {
                wcout << L"Введите ваше напоминание(максимальная длина 10000 символов!):" << endl;
                wcin.getline(text, 10001);
                wcout << endl;
                wcout << L"Если вы правильно ввели напоминание нижмите \"1\",\nдля повторного ввода - любую другую клавишу." << endl;
                                ch1 = _getch();
                system("cls");
        }
        while (ch1 != '1');
 
        do
        {
                system("cls");
                wcout << L"Ввод частоты напоминаний: \n1)В секундах\n2)В минутах\n3)В часах" << endl;
                                ch2 = _getch();
        }
        while (ch2 != '1' && ch2 != '2' && ch2 != '3');
 
        wcout << endl;
 
        switch (ch2)
        {
        case '1': 
                {
                        wcout << L"Выбран пункт \"1\" - введите интервал в секундах: ";
                        wcin >> n;
                        n *= 1000;
                        break;
                }
        case '2': 
                {
                        wcout << L"Выбран пункт \"2\" - введите интервал в минутах: ";
                        wcin >> n;
                        n *= 60000;
                        break;
                }
        case '3': 
                {
                        wcout << L"Выбран пункт \"3\" - введите интервал в часах: ";
                        wcin >> n;
                        n *= 3600000;
                        break;
                }
        }
 
        wcout << L"Ok!;)";
 
 
           do
        {
            
            ShowWindow(hWnd,SW_HIDE);
                Sleep(n);
                a = MessageBoxW(hWnd, text, L"Напоминание!", MB_RETRYCANCEL | MB_ICONWARNING | MB_DEFBUTTON1);
                if (a != 2) 
                {
                    ShowWindow(hWnd,SW_SHOW);
                    change();
                    ShowWindow(hWnd,SW_HIDE);
                }
        }
        while(a != 2);
        ShowWindow(hWnd,SW_SHOW);
return 0;
}
 
int main()
{
    locale::global(locale("russian_Russia.866"));
    //Только здесь и только вначале!
    HWND hWnd = GetForegroundWindow();
        wcout << L"Укажите режим работы программы \"Напоминалка\":" << endl;
        wcout << L"1) Загрузить расписание из файла schedule.txt." << endl;
        wcout << L"2) Использовать одиночное напоминание." << endl;
        wcout << L"3) Комбинированный режим." << endl;
        wcout << L"4) Выход." << endl;
 
        char fl;
 
        do
        {
            fl = _getch();
        }
        while (fl != '1' && fl != '2' && fl != '3' && fl != '4');
 
        if (fl == '1')
        {
                //scen1();
                wcout << L"1 - В разработке..." << endl;
        }
        else if (fl == '2')
        {
                scen2(hWnd); //Написали, пытаемся разобраться с _getch()'ем
        }
        else if (fl == '3')
        {
                //scen3();
                wcout << L"3 - В разработке..." << endl;
        }
        else if (fl == '4')
        {
                exit(0);
        }
        return 0;
}
1
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
05.11.2011, 21:24  [ТС] #25
Спасибо, ShowWindow(), действительно решил проблему.=)
Ответы которые я получил:
1) Из-за чего же _getch() игнорится? - Каким-то макаром на правильность работы влияют функции AllocConsole() и FreeConsole()(чем именно - хз), при этом не помогают ни wcin.sync(), ни wcin.ignore(), ни wcin.sync_with_stdio();
2) Как это предотвратить? - Не использовать AllocConsole() и FreeConsole(), использовать ShowWindow().
3) Как это лечить, если не получается избежать? - Хз. Если кто ответит - буду благодарен.
0
-=ЮрА=-
05.11.2011, 21:54
  #26

Не по теме:

Цитата Сообщение от Whiteha Посмотреть сообщение
1) Из-за чего же _getch() игнорится? - Каким-то макаром на правильность работы влияют функции AllocConsole() и FreeConsole()(чем именно - хз), при этом не помогают ни wcin.sync(), ни wcin.ignore(), ни wcin.sync_with_stdio();
устал вам об этом говорить
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
wcin.ignore(); ПЕРЕД _getch();
...

0
Whiteha
05.11.2011, 22:03  [ТС]
  #27

Не по теме:

-=ЮрА=-, я это понял ещё с первого вашего сообщения)
Но в данном случае основную проблему создавали AllocConsole() и FreeConsole() тк у меня от их глюков версия с "wcin.ignore(); ПЕРЕД _getch();" не помогала, у меня не помогало, если так точнее.=)

0
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2011, 22:04 #28
Whiteha, т.к. ві мне не верите скорее всего, вот Вам простецкий пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <conio.h>
using namespace std;
 
int main()
{
    long val;
    char str[1024];
    do
    {
        cout<<"Enter string\n";
        cin.getline(str,1024);
        cout<<"Enter lvalue : ";cin>>val;
        cout<<"Pres Y-key for new input\n";
        //cin.ignore();
    }
    while(toupper(_getch()) == 'Y');
    system("pause");
    return 0;
}
Сначала скомпилируйе с коментом и проведите хотябы 2 цикла, а потом расскоментируйте cin.ignore(); и посмотрите на корректную работу алгоритма...
0
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
05.11.2011, 22:26  [ТС] #29
Я вам верю, и здесь всё понятно и работает правильно(не без ignore() разумеется), может я где и ошибся, но у меня было так Проблема при вызове функции ...
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2011, 22:49 #30
Цитата Сообщение от Whiteha Посмотреть сообщение
вам верю, и здесь всё понятно и работает правильно(не без ignore() разумеется), может я где и ошибся, но у меня было так Проблема при вызове функции ...
- проблемма была в функции int change(), а не в АllocConsole() и FreeConsole()!В свиче (ниже его вам привожу цитатой), мы щёлкали ввод и без wcin.ignore в буфер подсаживался '\n' который далее всё и портил - ну на поверхности же всё лежит...

Не по теме:

С первого поста Вам об этом говорю, прогоните чтоли через пошаговое выполнение программу и сами посмотрите буффер после ввода...


Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
switch (ch2)
* * * * {
* * * * case '1':
* * * * * * * * {
* * * * * * * * * * * * wcout << L"Выбран пункт \"1\" - введите интервал в секундах: ";
* * * * * * * * * * * * wcin >> n;
* * * * * * * * * * * * n *= 1000;
* * * * * * * * * * * * break;
0
05.11.2011, 22:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2011, 22:49
Привет! Вот еще темы с ответами:

Identifier not found при вызове функции - C++
Здравствуйте. В моем консольном приложении помимо функции int _tmain, есть функция std::vector&lt;std::string&gt; CreateFileList(std::string...

Переменные передаваемые при вызове функции - C++
Не умею передавать значения переменных при вызове функции, кто бы смог подсказать как передать значения &quot;float v&quot; и &quot;countY&quot; в выражениях...

Игнорирование ошибок при вызове функции - C++
Подскажите пожалуйста возможно ли сделать вообще такое: Есть к примеру функция int getParam(){return 5;} Я к примеру не знаю что...

Создание переменной при вызове функции - C++
Хочу создать переменную при вызове функции для укорачивания кода, например вместо такого: wxVariant avSheetsItem; ...


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

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

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