Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка вместимости числа в буффер 
:(
    Опции темы
Lavroff
Дата 24.6.2010, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.5.2010

Репутация: нет
Всего: нет



Есть класс дроби. Собственно он определяется двумя главными параметрами типа int. Все сделано, все работает. Кроме проверки переполнения. Вводим допустим число 22222222222222222 - программа пишет сразу какой-то бред. Каким способом можно обойти это и выполнить проверку на вместимость в буфер? Реально ли это сделать, не изменяя типа главных параметров?

Я начал переписывать программу, используя два чара вместо инт. Переполнение, буквы вместо цифр, 0 в некоторых элементах, на все это проверка работает. Но есть пара тройка НО.

//1) Объем переделки кода. Он конечно маленький, но если делаешь для себя стоит ли его переделывать такое долгое время?
2) Объем функций которые получаются при переделке через char. Переделал только одну вчера ночью, на что терпения хватило. Она увеличилась примерно в два раза по сравнению с исходной функцией.
3) Интерес, как сделать не через char. Ибо с чаром все понял, сделать все реально, вопрос только во времени.

Пример функции которая получилась после использования чара. Написана на скоро руку, при огромном желании идти спать.

Код

Fraction Fraction::operator +(Fraction &ob)
{
        int f;int d; int c; int k; int l; int z;
        char*p; char*x;
        p=new char; x=new char;
        Fraction tempOb;
        if(strcmp(znam, ob.znam)==0)
        {
                f=atoi(tempOb.chisl);
                d=atoi(ob.chisl);
                c=atoi(chisl);
                f=d+c;
                k=atoi(tempOb.znam);
                l=atoi(znam);
                k=l;
                p=_itoa(f,p,10);
                x=_itoa(k,x,10);
                strcpy_s(tempOb.chisl,p);
                strcpy_s(tempOb.znam,x);
        }
        else
        {
                f=atoi(tempOb.chisl);
                d=atoi(ob.chisl);
                c=atoi(chisl);
                k=atoi(ob.znam);
                l=atoi(znam);
                f=c*k+d*l;
                z=atoi(tempOb.znam);
                z=l*k;
                p=_itoa(f,p,10);
                x=_itoa(z,x,10);
                strcpy_s(tempOb.chisl,p);
                strcpy_s(tempOb.znam,x);
        }
        tempOb.operator ~();
        return tempOb;
        delete p;
        delete x;
}

PM MAIL   Вверх
EvilsInterrupt
Дата 24.6.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Lavroff, 
>>22222222222222222
climits - это инклуд такой, имеющий максимальный и минимальный тип для той платформы куда ты прогу затачиваешь ;)
PM MAIL WWW ICQ Jabber   Вверх
Lavroff
Дата 24.6.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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-ю версию числа выдает

PM MAIL   Вверх
vnf
Дата 24.6.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 9.2.2008

Репутация: нет
Всего: 1



не изменяя тип "главных параметров" ты не можешь им присвоить значения больше упомянутого 2147483647.
Если надо больше - меняй на float или смотри в сторону длинной арифметики.
PM MAIL   Вверх
EvilsInterrupt
Дата 24.6.2010, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Lavroff, Грубо говоря, у каждого ПО есть ограничения. Наложи пока не больше INT_MAX , если пользователю твоего ПО этого будет мало. Воспользуешься uint64_t из stdint.h, который можно закачать в сети. Если уж и этого будет мало, тогда смотри в сторону, постом выше ;)
PM MAIL WWW ICQ Jabber   Вверх
Lavroff
Дата 24.6.2010, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.5.2010

Репутация: нет
Всего: нет



Проблема в том, что пользователь только я) Вообщем, скинул другу эту работающую программу, он нашел баг с переполнением) Вот я и пытаюсь понять, как сделать так, чтобы, когда вводишь число более 999999 писало что буфер переполнен. С чар эта проверка делается легко. Но писать программы через чар, когда нужен инт, это как-то... atoi(),itoa(),strcpy() постоянно юзать...

Если инт/лонг/дабл и т.п. Я ввожу число примерно такое: 22222287383848347387483748274837487442382784728748274827428742874, переменная остается того же значения, которое было в дефолте (скажем 0), следовательно про переполнение сообщение не выйдет. А программа начинает работать криво ТТ.

То есть. Строго говоря, это все необязательно, ибо реальное использование этой программы не подразумевает использования чисел больше тех, которые "влезают" в тип инт. А так же можно просто вывести это ограничение на экран. Однако, мне стало очень интересно КАК сделать так, чтобы выдавало ошибку о переполнении буфера, не переписывая всю программу через char.

Это сообщение отредактировал(а) Lavroff - 24.6.2010, 22:55
PM MAIL   Вверх
xvr
Дата 25.6.2010, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Считать сами дроби надо конечно в числах, а не в символах. А вот при преобразовании входных данных из символов в числа и надо ловить переполнения. Пока единственным способом (кроме как реализовать самому вручную) я вижу использование функций типа strtoul. Они проверяют входные данные и выдают минимальное/максимальное возможное значение при переполнении (с ними и сравнивать). Конечно самими минимальными/максимальными значениями придется пожертвовать  smile 

PM MAIL   Вверх
Lavroff
Дата 25.6.2010, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.5.2010

Репутация: нет
Всего: нет



Пример использования этой фукнции можно?
PM MAIL   Вверх
xvr
Дата 25.6.2010, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Lavroff @ 25.6.2010,  13:31)
Пример использования этой фукнции можно?

Код

char my_string[128];
gets(my_string);

char* endp;
unsigned v=strtoul(my_string,&endp,0);
if (*endp!=0 || v==UINT_MAX)
{
 printf("Error: Not a number or number overflow %s\n",my_string);
 abort();
}
// use v - this is your number

PM MAIL   Вверх
baldina
Дата 25.6.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



можно и не жертвовать UINT_MAX:

Код

char my_string[128];
gets(my_string);
char* endp;
unsigned v=strtoul(my_string,&endp,0);
if (*endp!=0 || errno == ERANGE)
{
 printf("Error: Not a number or number overflow %s\n",my_string);
 abort();
}
// use v - this is your number

PM MAIL   Вверх
Lavroff
Дата 25.6.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 19.5.2010

Репутация: нет
Всего: нет



 А вот при преобразовании входных данных из символов в числа и надо ловить переполнения. 

Это в каком ключе можно сделать? Допустим я объявляю две char: znam,chisl.

Пользуюсь strtoul, и потом могу использовать v(в которую я перевел числитель) для того, чтобы считать дроби?

Это сообщение отредактировал(а) Lavroff - 25.6.2010, 15:56
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.