Не работает cin

287
22 февраля 2017, 21:36

Задача - создать класс Группа, содержащий массив объектов класса Студент, и добавить в него меню для работы с группой. Я решил реализовать меню с управлением мышью. Проблема в том, что, когда пытаюсь добавить в группу новых студентов, cin на количество студентов не работает - курсор есть, но ввод произвести нельзя. А после нажатия нескольких рандомных клавиш (но не всех), программа вылетает с какой-нибудь ошибкой (в разных случаях ошибки разные). Необходимый код функций прилагаю (все лишнее или непонятное заменено/дополнено комментариями).

group &group::menu()
{
    CONSOLE_SCREEN_BUFFER_INFO bi;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &bi);
    /*здесь вывод меню*/
    cout << endl;
    const int menu_size = 7;
    hovered_area menu[menu_size];//hovered_area - структура, хранящая координаты однострочной прямоуг. области
    for (int i = 0; i < menu_size; i++)
    {
        menu[i].left_border = 0;
        menu[i].right_border = 25;
        menu[i].height = bi.dwCursorPosition.Y + 1 + i;
    }
    return mouse(menu);
}
group &group::mouse(hovered_area *area)
{
    int menu_size = 7;
    DWORD dwOldMode, dwMode, dwNumRead;
    GetConsoleMode(hStdIn, &dwOldMode);//hStdIn объявлен в заголовочном файле
    dwMode = ENABLE_MOUSE_INPUT;
    SetConsoleMode(hStdIn, dwMode);
    INPUT_RECORD irInBuf[128];
    COORD mousePos;
    DWORD mouseButtonState;
    while (1)
    {
        ReadConsoleInput(hStdIn, irInBuf, 128, &dwNumRead);
        for (DWORD i = 0; i < dwNumRead; i++)
        {
            mousePos = irInBuf[i].Event.MouseEvent.dwMousePosition;
            if (irInBuf[i].Event.MouseEvent.dwEventFlags == MOUSE_MOVED)
            {
                for (int i = 0; i < menu_size; i++)
                {
                    /*подсвечивание выбранного пункта при наведении*/
                }
            }
            mouseButtonState = irInBuf[i].Event.MouseEvent.dwButtonState;
            if (mouseButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
            {
                for (int j = 0; j < menu_size; j++)
                {
                    if (mousePos.X >= area[j].left_border && mousePos.X <= area[j].right_border && mousePos.Y == area[j].height)
                    {
                        char name[100];
                        int homeworks, done_homeworks;
                        int *marks;
                        int n;
                        vector<student> a;
                        switch (j)
                        {
                        /*case 0-2*/
                        case 3:
                            marks = new int[1];
                            marks[0] = -1;
                            delete[] marks;
                            cout << "Введите количество добавляемых студентов: ";
                            cin >> n;//проблемный cin
                            for (int k = 0; k < n; k++)
                            {
                                cout << "Введите имя студента: ";
                                cin.getline(name, 100);
                                cout << "Введите количество домашних заданий: ";
                                cin >> homeworks;
                                cout << "Введите количество выполненных домашних заданий: ";
                                cin >> done_homeworks;
                                if (done_homeworks != 0)
                                {
                                    marks = new int [done_homeworks];
                                    cout << "Введите оценки: ";
                                    for (int l = 0; l < done_homeworks; l++)
                                    {
                                        cin >> marks[i];
                                    }
                                }
                                if (done_homeworks != 0)
                                {
                                    a.push_back(student(name, homeworks, done_homeworks, marks));
                                }
                                else
                                {
                                    a.push_back(student(name, homeworks));
                                }
                            }
                            *this += group("", a);
                            return *this;
                        /*case 4-6*/
                        }
                    }
                }
            }
        }
    }
    SetConsoleMode(hStdIn, dwOldMode);
}

При необходимости могу дополнить вопрос.

READ ALSO
Очень медленно работает выборка INNER JOIN - MySQL

Очень медленно работает выборка INNER JOIN - MySQL

У меня есть таблица компании, таблица недвижимости и таблица с параметрами недвижимостиПри выборе недвижимости, например квартиры на съем,...

281
Count в значение таблицы mysql

Count в значение таблицы mysql

Интересует вопрос можно ли то таблицу в которой одно из полей будет содержать в себе количество записей из другой таблицы? В access вроде так...

203
Mysql сортировка по кастомному полю

Mysql сортировка по кастомному полю

ЗдравствуйтеЕсть характеристики которые берутся из 3 (трех) таблиц

203