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

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

Войти
Регистрация
Восстановить пароль
 
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
#1

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

20.12.2013, 01:28. Просмотров 500. Ответов 6
Метки нет (Все метки)

Занимаюсь решением задачи 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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2013, 01:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка overflow_error (C++):

Обработка события Click, вставка html после генерации и обработка этого кода - jQuery
Подскажите пожалуйста как заставить работать эту часть кода 18 строка $(&quot;.image&quot;).click(function() { alert (1); ...

Обработка одномерных массивов и Обработка двухмерных массивов. - Visual Basic
Всем привет, У меня большие проблемы... нужно сделать 2 лабораторные работы по информатике, но я ничегошеньки в VB не понимаю... ...

Обработка 1с 8 - 1С
Собственно проблема-то не в системе, а в мозге :) На форме обработки имеется таблица, поля таблицы описаны в тексте обработки...

обработка - C++ Qt
добрые вечер! подскажите как провернуть: идет показ картинок и пользователь должен выбрать 1 из 3-х предложенных вариантов... показ...

Обработка на 7 - 1С
Здравствуйте, написал простенькую обработочку для 8, теперь столкнулся что мне она понадобится и в 7ке. С семерошным языком не знаком т.к....

Обработка - 1С
Здравствуйте. Есть две обработки сделанные на 8.0, помогите переделать их на 8.3. Чтоб не приходилось запускать через толстый клиент.

6
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.12.2013, 01:33 #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>
подключайте правильные хидеры. если не знаете какие - забивайте классы, имена, функции, ... в поисковики. там все легко находится.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
20.12.2013, 01:38 #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 ( )
1
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
20.12.2013, 01:47  [ТС] #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)

Спасибо.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
20.12.2013, 01:52 #5
Цитата Сообщение от Wlk Посмотреть сообщение
В книге в предыдущем примере runtime_error был инициализирован строкой, которая потом могла быть выведена и играла роль описания ошибки.
в том примере Вы сами кидали исключение, в этом примере кидает исключение to_ulong, так что и "описание" тоже оттуда.
Можете перехватить и кинуть ту же ошибку, но со своим описанием, только это бредово как-то...

Добавлено через 43 секунды
Цитата Сообщение от Wlk Посмотреть сообщение
Какую роль выполняет & в данном случае?
ссылки учили?
0
Wlk
49 / 49 / 13
Регистрация: 07.12.2011
Сообщений: 133
20.12.2013, 01:59  [ТС] #6
Вообще да. Но я привык что, есть переменная, которая была объявлена где-то раньше. И тогда на адрес этой переменной можно ссылаться. Здесь же "err" появляется впервые. При чем ссылку я привык видеть в качестве r-операнда присвоения. Где я недопонял?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
20.12.2013, 02:05 #7
http://valera.asf.ru/cpp/book/c11.html
11.3.1. Объекты-исключения
1
20.12.2013, 02:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2013, 02:05
Привет! Вот еще темы с ответами:

1C 8.x Обработка - 1С
Народ! Впервые пишу обработку по загрузке данных из файла. Подскажите, как брать данные из файла. Вот я выбираю файл &amp;НаКлиенте Процедура...

Обработка - Turbo Pascal
Пусть дана последовательность из n элементов .Уменьшить её, удалив первый из отрицательных и минимальных из положительных (такой элемент...

1C 8.x Обработка - 1С
Подскажите с чего начать. Есть 1. 1.РС(независимый)&quot;Расписание сеансов&quot;-(Кинотеатр/дата/сеанс/фильм).Нужно создать обработку с...

Обработка - 1С
Во вкладке &quot; Выбранные поля&quot; в столбце &quot;Наименование&quot; выводит контрагент,договор и контейнерная площадка. К ним я добавил Ответственный....


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

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

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