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

Обработка overflow_error - C++

Восстановить пароль Регистрация
 
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
20.12.2013, 01:28     Обработка overflow_error #1
Занимаюсь решением задачи 6.23 из самоучителя Липпмана.
Задание:
функция to_ulong() класса bitset передает исключение типа overflow_error в случае, если размер набора битов превосходит размер типа unsigned long. Напишите программу, которая передает это исключение. Обработчик этого исключения должен отображать соответствующее сообщение.

Лично у меня родился такой код (см. ниже).
1. Как узнать максимальный размер ulong на своей машине, чтоб выбрать битсет функция to_ulong() которого была бы больше этого числа? Значение b(0x1F2BC895678767232) выбрано методом проб и ошибок, прибавляя каждый раз по одной проихвольной цифре в конец, пока не выскочила ошибка "слишком большая константа".
2. Передача overflow_error происходит неявно в данном случае или как тогда написать раздел throw?
3. Инициализировать overflow_error err("That") в разделе catch нельзя, а где тогда можно?
4. Кроме того, компилятор выдал ошибки и предупреждения. Как мне исправить данный код?

1>\test000.cpp(1) : warning C4305: аргумент: усечение из '__int64' к 'unsigned long'
1>\test000.cpp(1) : warning C4309: аргумент: усечение константного значения
1>\test000.cpp(7) : error C2059: синтаксическая ошибка: строка
1>c\test000.cpp(9) : error C2228: выражение слева от ".what" должно представлять класс, структуру или объединение
1> тип: std::overflow_error (__cdecl *)(void)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bitset<64> b(0x1F2BC895678767232);
int main()
{   
        try {
            cout << b.to_ulong() << endl;
            }
        catch  (overflow_error err("That number is too big"))
        {
            cout << err.what() << endl;
                        _getch();
            return -1;
        }
    _getch();
    return 0;
}
Заранее спасибо.

Добавлено через 2 часа 17 минут
upd.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2013, 01:28     Обработка overflow_error
Посмотрите здесь:

Обработка ошибок C++
Обработка текста C++
C++ обработка строк.
Обработка двумерных массивов. Обработка матриц C++
Обработка исключений C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.12.2013, 01:33     Обработка overflow_error #2
http://en.cppreference.com/w/cpp/error/overflow_error
std::overflow_error
C++ Utilities library Error handling std::overflow_error
Defined in header <stdexcept>
подключайте правильные хидеры. если не знаете какие - забивайте классы, имена, функции, ... в поисковики. там все легко находится.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
20.12.2013, 01:38     Обработка overflow_error #3
C++
1
2
3
4
5
6
7
8
        try {
            cout << b.to_ulong() << endl;
            }
        catch  (const overflow_error & err)
        {
            cout << err.what() << endl;
            return -1;
        }
Добавлено через 2 минуты
Цитата Сообщение от Wlk Посмотреть сообщение
Как узнать максимальный размер ulong на своей машине
размер определяется на этапе компиляции
sizeof ( unsigned long )

Добавлено через 1 минуту
Цитата Сообщение от Wlk Посмотреть сообщение
чтоб выбрать битсет функция to_ulong() которого была бы больше этого числа?
берете bitset размера больше чем unsigned long(в битах) и обнуляете все биты. Потом делаете b.flip ( )
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
20.12.2013, 01:47  [ТС]     Обработка overflow_error #4
Спасибо. Если можно пару уточнений.
В книге в предыдущем примере runtime_error был инициализирован строкой, которая потом могла быть выведена и играла роль описания ошибки.
C++
1
2
3
throw runtime_error("Data must refer to same ISBN");
// .......
cout << err.what();
1. Можно ли инициализировать так же с overflow_error?

2. Не совсем понятна конструкция (const overflow_error & err). Опять же в примере в книге приведено так
C++
1
catch (runtime_error err)
Это я понимаю как объект с именем err класса runtime_error.
А как ее следует читать const overflow_error & err? Какую роль выполняет & в данном случае? (Это как 2 разных объекта или как один с именем err)

Спасибо.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
20.12.2013, 01:52     Обработка overflow_error #5
Цитата Сообщение от Wlk Посмотреть сообщение
В книге в предыдущем примере runtime_error был инициализирован строкой, которая потом могла быть выведена и играла роль описания ошибки.
в том примере Вы сами кидали исключение, в этом примере кидает исключение to_ulong, так что и "описание" тоже оттуда.
Можете перехватить и кинуть ту же ошибку, но со своим описанием, только это бредово как-то...

Добавлено через 43 секунды
Цитата Сообщение от Wlk Посмотреть сообщение
Какую роль выполняет & в данном случае?
ссылки учили?
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
20.12.2013, 01:59  [ТС]     Обработка overflow_error #6
Вообще да. Но я привык что, есть переменная, которая была объявлена где-то раньше. И тогда на адрес этой переменной можно ссылаться. Здесь же "err" появляется впервые. При чем ссылку я привык видеть в качестве r-операнда присвоения. Где я недопонял?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2013, 02:05     Обработка overflow_error
Еще ссылки по теме:

C++ обработка WAV на C++
Обработка мыши VS C++ C++
Обработка out_of_range C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
20.12.2013, 02:05     Обработка overflow_error #7
http://valera.asf.ru/cpp/book/c11.html
11.3.1. Объекты-исключения
Yandex
Объявления
20.12.2013, 02:05     Обработка overflow_error
Ответ Создать тему
Опции темы

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