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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
03.11.2011, 21:36     Проблема при вызове функции #1
Написал для себя простенькую напоминалку, выводящую указанное сообщение через определённый промежуток времени(ну там, "отойди от компа, глаза разомни"))) и тп). И всё бы работает нормально, но вот как только происходит вызов функции 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();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TwiX
59 / 59 / 1
Регистрация: 27.10.2011
Сообщений: 189
04.11.2011, 03:30     Проблема при вызове функции #2
Цитата Сообщение от Whiteha Посмотреть сообщение
"Продолжить напоминанать \""
Небольшая ошибка

Цитата Сообщение от Whiteha Посмотреть сообщение
AllocConsole();
Что??? Зачем?
Убрать.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
04.11.2011, 03:51     Проблема при вызове функции #3
Цитата Сообщение от Whiteha Посмотреть сообщение
ch1 = ch2 = ch3 = ch4 = 0;
....
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');
А изменения ch4 нигде нет.


Цитата Сообщение от TwiX Посмотреть сообщение
Что??? Зачем?
Создать окно консоли.
TwiX
59 / 59 / 1
Регистрация: 27.10.2011
Сообщений: 189
04.11.2011, 03:58     Проблема при вызове функции #4
Цитата Сообщение от kazak Посмотреть сообщение
Создать окно консоли.
Извиняюсь, не увидел до этого FreeConsole()

Ещё заметил, что второй раз консоль не всегда закроется. Перед return'ами в change() надо бы добавить FreeConsole() )
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
04.11.2011, 04:02     Проблема при вызове функции #5
Цитата Сообщение от TwiX Посмотреть сообщение
Ещё заметил, что второй раз консоль не всегда закроется.
Ага, оно вообще не закроется, потому что стоит после последнего return'а.
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
04.11.2011, 13:55  [ТС]     Проблема при вызове функции #6
Собственно да, FreeConsole() нужно было воткнуть к 82 строке.)
Но почему траблы с реинициализирующей функцией?
Про отсутствие _getch() - это вы правильно заметили, видно глаз у меня тогда замылился, но самое удивительное - я его добавил, но первый do while в change() всё равно бегает в бесконечном цикле.(
Если же заменить _getch() на cin то он всё нормально читает, как сделать чтобы _getch() не проскакивал?

Добавлено через 1 час 39 минут
Повторюсь, проблема свелась к тому что проскакивает _getch(), может ли в таком случае помочь _ungetch()?
-=ЮрА=-
Заблокирован
Автор FAQ
04.11.2011, 20:25     Проблема при вызове функции #7
Цитата Сообщение от Whiteha Посмотреть сообщение
wcin.getline(text, 10001);
* * * * * * * * cout << endl;
- и далее во всех вводах в буфере после getline "сидит" '\n' он то и "нажимает" getch предлагаю после getline либо вбить wcin.ignore(); либо getchar. Как дойдут руки подправлю код...
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
04.11.2011, 21:41  [ТС]     Проблема при вызове функции #8
Странность в том, что пролетают только _getch()'и из функции change()... я уже себе весь мозг сломал, ну почему оно так происходит???(
-=ЮрА=-
Заблокирован
Автор FAQ
04.11.2011, 22:33     Проблема при вызове функции #9
Цитата Сообщение от Whiteha Посмотреть сообщение
Странность в том, что пролетают только _getch()'и из функции change()... я уже себе весь мозг сломал, ну почему оно так происходит???(
- я же и говрю, что
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
в буфере после getline "сидит" '\n' он то и "нажимает" getch
, сейчас поковыряю Ваш код...
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
04.11.2011, 22:46  [ТС]     Проблема при вызове функции #10
Буду очень признателен если найдётся решение.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
04.11.2011, 22:52     Проблема при вызове функции #11
Не по теме:
Какова задача использования UNICODE в твоей программе?
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
04.11.2011, 23:06  [ТС]     Проблема при вызове функции #12
Избавляет от трабл с великим и могучим. Без него твориться неладное, метод борьбы взят отсюда. Буду признателен, если у вас есть ещё методы по борьбе с кодировками, которыми вы готовы поделиться.
По теме: Мой мозг на грани слома, очень волнует проскакивание/игнорирование _getch(), если кому-то что то об этом известно - помогите исправить, нужен именно _getch().
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2011, 00:47     Проблема при вызове функции #13
Whiteha, по коду есть замечания но о них в другой раз, вот подправленный код + как бонус - вариант руссификации без wchar и прочих сложностей...
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
// timet.cpp : Defines the entry point for the console application.
//
 
#include <iostream>
#include <cstdio>
#include <conio.h>
#include <windows.h>
using namespace std;
 
//Руссификация
ostream& operator<<(ostream &stream,char* s){
    for(char* ps=s; *ps; ps++){
        if(*ps=='ё')
            stream<<char(241);
        else if(*ps=='Ё')
            stream<<char(240);
        else if(*ps>=-64 && *ps<=-17)           
            stream<<char(*ps+64+128);
        else if(*ps<0)
            stream<<char(*ps+64+176);
        else
            stream<<*ps;
    }
    return stream;
}
 
 
int change();
 
int main()
{
    HWND hWnd = GetForegroundWindow();//Ну юзайте уже и дескриптор окна
    //раз уж MessageBox юзаете
    char ch,text[10001];
    unsigned long n;
    int a, b;
 
    cout << "------------------------------------------" << endl;
    cout << "|Программа для автоматических напоминаний|" << endl;
    cout << "------------------------------------------" << endl << endl;
 
    do
    {
        cout << "Введите ваше напоминание(максимальная длина 10000 символов!):" << endl;
        cin.getline(text, 10001);
        cout << "Если вы правильно ввели напоминание нижмите \"1\",\nдля повторного ввода - любую другую клавишу." << endl;
    }
    while (getch() != '1');
 
    do
    {
        cout << "Ввод частоты напоминаний: \n1)В секундах\n2)В минутах\n3)В часах" << endl;
        ch = getch();
    }
    while ((ch != '1') && (ch != '2') && (ch != '3'));
    cout << endl;
 
    switch (ch)
    {
        case '1': 
            cout << "Выбран пункт \"1\" - введите интервал в секундах: ";
            cin >> n;
            n *= 1000;
            break;
        case '2': 
            cout << "Выбран пункт \"2\" - введите интервал в минутах: ";
            cin >> n;
            n *= 60000;
            break;
        default: 
            cout << "Выбран пункт \"3\" - введитеи интервал в часах: ";
            cin >> n;
            n *= 3600000;
            break;
    }
    cout << "Ok!;)";
    Sleep(3000);
 
    do
    {
        Sleep(n);
        a = MessageBox(hWnd, text, "Напоминание!", MB_RETRYCANCEL|MB_ICONWARNING|MB_DEFBUTTON1 );
        if (a != 2) 
            b = change();//Можно спросить, зачем b вообще???
    }
    while(a != 2);
    system("pause");//Стоп-точка можно убрать если хотим закріть приложение сразу после while
    return 0;
}
 
int change()
{
    char ch,text[10001];
    unsigned long n;
    do
    {
        cout << "Продолжить напоминанать \"" << text << "\"?" << endl;
        cout << "1) Да, продолжить." << endl;
        cout << "2) Нет, сменить напоминание и интервал." << endl;
        cout << "3) Нет, завершить программу." << endl;
        ch = getch();
    } 
    while (ch != '1' && ch != '2' && ch != '3');
    switch (ch)
    {
        case '1': 
            cout << "Выбран пункт \"1\" - продолжаю... ";
            Sleep(2000);
            return 1;
            break;
        case '2': 
            cout << "Выбран пункт \"2\" - смена напоминания и интервала его отображения. ";
            do
            {
                cout << L"Введите ваше напоминание(максимальная длина 10000 символов!):" << endl;
                cin.getline(text, 10001);
                cout << endl;
                cout << "Если вы правильно ввели напоминание нижмите \"д\",\nдля повторного ввода - любую другую клавишу." << endl;
            }
            while (getch() != '1');
 
            do
            {
                cout << "Ввод частоты напоминаний: \nа)В секундах\nб)В минутах\nв)В часах" << endl;
                ch = getch();
            }
            while (ch != '1' && ch != '2' && ch != '3');
                        
            switch (ch)
            {
                case '1': 
                    cout << "Выбран пункт \"1\" - введите интервал в секундах: ";
                    cin >> n;
                    n *= 1000;
                    break;
                case '2': 
                    cout << "Выбран пункт \"2\" - введите интервал в минутах: ";
                    cin >> n;
                    n *= 60000;
                    break;
                default: 
                    cout << "Выбран пункт \"3\" - введитеи интервал в часах: ";
                    cin >> n;
                    n *= 3600000;
                    break;
            };
            return 2;
            break;
        default: 
            exit(0);
            break;
    };
    return 0;
}
Миниатюры
Проблема при вызове функции  
kazak
05.11.2011, 01:13
  #14

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
вариант руссификации без wchar и прочих сложностей...
Чем же вас CharToOem не устраивает?

Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
05.11.2011, 14:52  [ТС]     Проблема при вызове функции #15
-=ЮрА=-, спасибо за ответ! Мой код был не допилен и int b там вообще лишняя, ну да бог с ней, к ожалению ваш вариант у меня имеет проблемы с кодировками...
По факту, при CharacterSet = Use Unicode Character Set получаем
[IMG]http://s54.***********/i144/1111/fd/ee3ea685fb10.jpg[/IMG]
Уже понятно что у вас CharacterSet = Use Multi-Byte Character Set, на всякий случай правлю MessageBox который у меня дефайнится как MessageBoxW на MessageBoxA, получаю:
[IMG]http://s46.***********/i113/1111/8e/9ccf529a5011.jpg[/IMG]
Выставляю CharacterSet = Use Multi-Byte Character Set(мессадж бокс меняю обратно разумеется), получаю:
[IMG]http://s017.***********/i414/1111/4c/cb6bad90761b.jpg[/IMG]
Картина одинаковая, что странно...

При этом вызов функции change забивает консоль мусором:
[IMG]http://i062.***********/1111/1a/1dc735f95eab.png[/IMG]

Что с _getch() я так и не понял, ответе пожалуйста кто может!
1) Из-за чего же _getch() игнорится? Не помогают ни wcin.sync(), ни wcin.ignore(), ни wcin.sync_with_stdio();
2) Как это предвидеть и избежать?
3) Как это лечить, если не получается избежать?

Добавлено через 12 минут
Сейчас код имеет такой вид(недоделки вырезаны):
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
#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;
        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;
                //ch1 = _getch();
                cin >> ch1;
                system("cls");
            }
            while (ch1 != '1');
 
            do
            {
                system("cls");
                wcout << L"Ввод частоты напоминаний: \n1)В секундах\n2)В минутах\n3)В часах" << endl;
                //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!;)";
 
    FreeConsole();
 
           do
    {
        Sleep(n);
        a = MessageBoxW(GetForegroundWindow(), text, L"Напоминание!", MB_RETRYCANCEL | MB_ICONWARNING | MB_DEFBUTTON1);
        if (a != 2) 
        {
            AllocConsole();
            change();
            FreeConsole();
        }
    }
    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);
    }
}
Добавлено через 12 минут
Теперь передаю в MessageBox() не NULL, а GetForegroundWindow(). Как я понял это должно всегда выводить сообщение поверх активного окна (с NULL не так?)...
P.S. -=ЮрА=-, если если есть замечания к коду говорите сразу! Я только учусь и с радостью исправлюсь если где-то напортачил, но это будет возможно только если мне об этом скажут.

Добавлено через 12 часов 21 минуту
Up! Up!
-=ЮрА=-
Заблокирован
Автор FAQ
05.11.2011, 14:59     Проблема при вызове функции #16

Не по теме:

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



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

Цитата Сообщение от Whiteha Посмотреть сообщение
P.S. -=ЮрА=-, если если есть замечания к коду говорите сразу!
- вы оставили свой код, на мой как бы наплевали, и паяете с whar поэтому мне не охота биться головой об стену, за _getch я вам выше писал писал, но вы этого не восприняли...
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. Я ставлю "спасибо" всем, кто даёт нужные ответы на поставленные вопросы.
-=ЮрА=-
Заблокирован
Автор 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;
        }
-=ЮрА=-
Заблокирован
Автор 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:Скрин после меседжбокса
Миниатюры
Проблема при вызове функции  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2011, 19:29     Проблема при вызове функции
Еще ссылки по теме:

C++ Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов
Игнорирование ошибок при вызове функции C++
C++ Identifier not found при вызове функции

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

Или воспользуйтесь поиском по форуму:
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()) нужны - как быть?
Миниатюры
Проблема при вызове функции  
Yandex
Объявления
05.11.2011, 19:29     Проблема при вызове функции
Ответ Создать тему
Опции темы

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