![]() |
|
Модераторы: bsa |
![]()
|
|
| Lavroff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 19.5.2010 Репутация: нет Всего: нет |
Есть класс дроби. Собственно он определяется двумя главными параметрами типа int. Все сделано, все работает. Кроме проверки переполнения. Вводим допустим число 22222222222222222 - программа пишет сразу какой-то бред. Каким способом можно обойти это и выполнить проверку на вместимость в буфер? Реально ли это сделать, не изменяя типа главных параметров?
Я начал переписывать программу, используя два чара вместо инт. Переполнение, буквы вместо цифр, 0 в некоторых элементах, на все это проверка работает. Но есть пара тройка НО. //1) Объем переделки кода. Он конечно маленький, но если делаешь для себя стоит ли его переделывать такое долгое время? 2) Объем функций которые получаются при переделке через char. Переделал только одну вчера ночью, на что терпения хватило. Она увеличилась примерно в два раза по сравнению с исходной функцией. 3) Интерес, как сделать не через char. Ибо с чаром все понял, сделать все реально, вопрос только во времени. Пример функции которая получилась после использования чара. Написана на скоро руку, при огромном желании идти спать.
|
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Lavroff,
>>22222222222222222 climits - это инклуд такой, имеющий максимальный и минимальный тип для той платформы куда ты прогу затачиваешь ;) |
|||
|
||||
| Lavroff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 19.5.2010 Репутация: нет Всего: нет |
EvilsInterrupt, А как это использовать? Я вчера пытался это как-то сделать через limits, но как-то ничего не вышло.
#include <iostream> #include <limits> int main() { std::cout<<std::numeric_limits<int>::max()<<'\n'; return 0; } Вывод: std::numeric_limits<int>::max returned 2147483647 int И как мне использовать сие волшебное число? П.С. на ноуте вообще 16-ю версию числа выдает |
|||
|
||||
| vnf |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 9.2.2008 Репутация: нет Всего: 1 |
не изменяя тип "главных параметров" ты не можешь им присвоить значения больше упомянутого 2147483647.
Если надо больше - меняй на float или смотри в сторону длинной арифметики. |
|||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Lavroff, Грубо говоря, у каждого ПО есть ограничения. Наложи пока не больше INT_MAX , если пользователю твоего ПО этого будет мало. Воспользуешься uint64_t из stdint.h, который можно закачать в сети. Если уж и этого будет мало, тогда смотри в сторону, постом выше ;)
|
|||
|
||||
| Lavroff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 19.5.2010 Репутация: нет Всего: нет |
Проблема в том, что пользователь только я) Вообщем, скинул другу эту работающую программу, он нашел баг с переполнением) Вот я и пытаюсь понять, как сделать так, чтобы, когда вводишь число более 999999 писало что буфер переполнен. С чар эта проверка делается легко. Но писать программы через чар, когда нужен инт, это как-то... atoi(),itoa(),strcpy() постоянно юзать...
Если инт/лонг/дабл и т.п. Я ввожу число примерно такое: 22222287383848347387483748274837487442382784728748274827428742874, переменная остается того же значения, которое было в дефолте (скажем 0), следовательно про переполнение сообщение не выйдет. А программа начинает работать криво ТТ. То есть. Строго говоря, это все необязательно, ибо реальное использование этой программы не подразумевает использования чисел больше тех, которые "влезают" в тип инт. А так же можно просто вывести это ограничение на экран. Однако, мне стало очень интересно КАК сделать так, чтобы выдавало ошибку о переполнении буфера, не переписывая всю программу через char. Это сообщение отредактировал(а) Lavroff - 24.6.2010, 22:55 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Считать сами дроби надо конечно в числах, а не в символах. А вот при преобразовании входных данных из символов в числа и надо ловить переполнения. Пока единственным способом (кроме как реализовать самому вручную) я вижу использование функций типа strtoul. Они проверяют входные данные и выдают минимальное/максимальное возможное значение при переполнении (с ними и сравнивать). Конечно самими минимальными/максимальными значениями придется пожертвовать
|
|||
|
||||
| Lavroff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 19.5.2010 Репутация: нет Всего: нет |
Пример использования этой фукнции можно?
|
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
|
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
можно и не жертвовать UINT_MAX:
|
|||
|
||||
| Lavroff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 19.5.2010 Репутация: нет Всего: нет |
А вот при преобразовании входных данных из символов в числа и надо ловить переполнения.
Это в каком ключе можно сделать? Допустим я объявляю две char: znam,chisl. Пользуюсь strtoul, и потом могу использовать v(в которую я перевел числитель) для того, чтобы считать дроби? Это сообщение отредактировал(а) Lavroff - 25.6.2010, 15:56 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |