Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2010, 20:39   #1
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
Вопрос Поиск ошибок

Уважаемые программеры, только что писал прогу, частью которой является вот этот кусок:
Код:
int numer;
size_t denom;

// . . .

if(!denom) denom = 1;
size_t smallest = static_cast<size_t>(small_abs(numer, denom)/2);
for(size_t i=2; i<=smallest; i++)
         if(numer%i==0 && denom%i==0)
         {
		numer = numer/static_cast<double>(i);
		denom = denom/i;
		smallest = smallest/i;
          }

// Функция small_abs(int, int):
size_t small_abs(int a, int b)
{
	if(a<0) a = -a;
	if(b<0) b = -b;
	return (a < b ? a : b);
}
И с удивлением для себя обнаружил тут одну нехорошую ошибку (с помощью отладчика где-то на десятом проходе). Если у вас есть время и нечем заняться - можете посмотреть.
Подсказка: при вводе numer = -101 и denom = 150 в конце numer = -20 и denom = 30 вместо numer = -101 и denom = 150.
Фактически эта штука просто сокращает дробь с числителем numer и знаменателем denom.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."

Последний раз редактировалось Syuf; 25.05.2010 в 09:19.
Syuf вне форума Ответить с цитированием
Старый 25.05.2010, 18:32   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Код:
int numer;
size_t denom;

// . . .

if(!denom) denom = 1;
size_t smallest = static_cast<size_t>(small_abs(numer, denom)/2);
for(size_t i=2; i<=smallest; i++)
         if(numer%static_cast<int>(i)==0 && denom%i==0)
         {
		numer = numer/static_cast<double>(i);
		denom = denom/i;
		smallest = smallest/i;
          }

// Функция small_abs(int, int):
size_t small_abs(int a, int b)
{
	if(a<0) a = -a;
	if(b<0) b = -b;
	return (a < b ? a : b);
}
При выполнении арифметических операций вида int operator size_t (кроме '+') объект типа int приводится к size_t и в итоге в сравнении numer%i==0 участвуют числа не -101 и 5, а 4294967195 и 5, соответственно и остаток от деления - 0.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск ошибок в вариантах кода. Проверьте fs444 Общие вопросы C/C++ 6 31.03.2010 20:11
Поиск ошибок lubafffka Помощь студентам 6 04.12.2009 00:56
Обработчик ошибок. Dj_smart Общие вопросы Delphi 17 30.03.2008 11:58
обнаружение ошибок makar575 Фриланс 3 18.12.2007 07:56