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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2013, 09:03   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию Округление целочисленной константы в большую сторону

Подскажите плиз, как проще округлить целочисленную константу в большую сторону до фиксированного значения. Вот мой
Код:
  SizeOf_Test1 = 31;
  SizeOf_Test2 = 32;
  SizeOf_Test3 = 33;
  SizeOf_Test4 = 871;
  SizeOf_Test5 = 528;

  _ROUND_SIZE = 16;
  _SIZE_TEST1 = SizeOf_Test1 + ((_ROUND_SIZE - (SizeOf_Test1 mod _ROUND_SIZE)) mod _ROUND_SIZE);
  _SIZE_TEST2 = SizeOf_Test2 + ((_ROUND_SIZE - (SizeOf_Test2 mod _ROUND_SIZE)) mod _ROUND_SIZE);
  _SIZE_TEST3 = SizeOf_Test3 + ((_ROUND_SIZE - (SizeOf_Test3 mod _ROUND_SIZE)) mod _ROUND_SIZE);
  _SIZE_TEST4 = SizeOf_Test4 + ((_ROUND_SIZE - (SizeOf_Test4 mod _ROUND_SIZE)) mod _ROUND_SIZE);
  _SIZE_TEST5 = SizeOf_Test5 + ((_ROUND_SIZE - (SizeOf_Test5 mod _ROUND_SIZE)) mod _ROUND_SIZE);
Всё работает
Цитата:
31 -> 32
32 -> 32
33 -> 48
871 -> 880
528 -> 528
Но конструкция
Код:
  _SIZE = SizeOf(TMyType) + ((_ROUND_SIZE - (SizeOf(TMyType) mod _ROUND_SIZE)) mod _ROUND_SIZE);
кажется мне довольно грамоздкой. Я понимаю, что более короткая запись никак не повлияет на производительность. Но всё-таки хотелось бы придать некую эстетичность и удобочитаемость коду. Чтоб глянул на код и сразу понятно, что он делает без всяких комментариев. Ну и так, в целях повышения образованности ©.
Sibedir вне форума Ответить с цитированием
Старый 21.02.2013, 09:28   #2
superedward
Форумчанин
 
Аватар для superedward
 
Регистрация: 27.11.2012
Сообщений: 190
По умолчанию

Наверное, вы не видели по-настоящему громоздких конструкций. Обзовите переменные покороче или сделайте функцию с говорящим названием
superedward вне форума Ответить с цитированием
Старый 21.02.2013, 09:43   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
или сделайте функцию с говорящим названием
Хотел так
Код:
uses
  MyUnit1;
const
  _SIZE_TEST1 = RoundIntUp (SizeOf_Test1, _ROUND_SIZE);
где
Код:
unit MyUnit1;
...
function RoundIntUp (AValue, ARoundTo: Integer): Integer; inline;
begin
  Result := AValue + ((ARoundTo - (AValue mod ARoundTo)) mod ARoundTo);
end;
но незя:
Цитата:
mainform.pas(12,55) Error: Illegal expression // незаконное выражение
Sibedir вне форума Ответить с цитированием
Старый 21.02.2013, 09:44   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Чтоб глянул на код и сразу понятно, что он делает без всяких комментариев.
Трудно что-то предложить, я сторонник того, чтобы каждая строка (за исключением служебных типа {}, begin-end и т.д.) или логическая группа строк кода должны обязательно сопровождаться комментарием по логике программы.

ЗЫ. Еще я не понял, зачем округлять константы на этапе выполнения программы...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 21.02.2013 в 09:46.
Utkin вне форума Ответить с цитированием
Старый 21.02.2013, 10:02   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Я сторонник такого подхода: http://www.gunsmoker.ru/2010/07/blog-post_31.html . Практика показала, что:
1. код, требующий подробных комментариев, как правило требует хорошей переработки (исключение составляют редкие замороченные алгоритмы и asm-вставки)
2. написание качественных комментариев отнимают много времени, а некачественные - только сбивают с толку
3. проще разобраться по коду (если он опять же 'грамотный'), чем по написанным когда-то комментариям
Цитата:
зачем округлять константы на этапе выполнения программы...
константа работает гораздо быстрее чем переменная (без обращения к памяти. сразу забивается в исполняемый код)

Последний раз редактировалось Sibedir; 21.02.2013 в 10:13.
Sibedir вне форума Ответить с цитированием
Старый 21.02.2013, 10:27   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
код, требующий подробных комментариев, как правило требует хорошей переработки
Это неверно, Вы сами пробовали ?
Цитата:
написание качественных комментариев отнимают много времени
Создание качественных программ вообще отнимает много времени, гораздо больше чем принято считать.
Цитата:
проще разобраться по коду (если он опять же 'грамотный'), чем по написанным когда-то комментариям
Это опять-таки говорит о том, что вы не пользовались подобной методикой.
Ну да дело Ваше
Цитата:
константа работает гораздо быстрее чем переменная (без обращения к памяти. сразу забивается в исполняемый код)
Как константа может забиться в исполняемый код, если Вы ее еще только вычисляете? Вот для этого и нужны комментарии
Ну не это главное, я повторю вопрос - зачем вычислять константу? Что Вам мешает посчитать Ваши цифры заранее?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 21.02.2013, 10:56   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да, кстати, мне тоже непонятно, кто мешает написать так?!
Код:
const
  SizeOf_Test1 = 31;
  SizeOf_Test2 = 32;
  SizeOf_Test3 = 33;
  SizeOf_Test4 = 871;
  SizeOf_Test5 = 528;

  _ROUND_SIZE = 16;
  _SIZE_TEST1 =  32;  
  _SIZE_TEST2 =  32;  
  _SIZE_TEST3 =  48;  
  _SIZE_TEST4 =  880; 
  _SIZE_TEST5 =  528;
Цитата:
константа работает гораздо быстрее чем переменная (без обращения к памяти. сразу забивается в исполняемый код)
о! Это, конечно, очень весомый аргумент. Можно съэкономить пару-другую микросекунд... Поймите, что даже если Вы ТЫСЯЧУ таких констант вычислите, то это у программы займёт менее одной тысячной секунды (грубо, но порядок такой). Потеря десяти микросекунды - это принципиально для Вас?!

Последний раз редактировалось Serge_Bliznykov; 21.02.2013 в 11:01.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.02.2013, 12:30   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Поймите, что даже если Вы ТЫСЯЧУ таких констант вычислите, то это у программы займёт менее одной тысячной секунды (грубо, но порядок такой). Потеря десяти микросекунды - это принципиально для Вас?!
Дело не во времени вычисления, а во времени доступа к памяти. При обработке пары десятков мегабайт речь пойдет далеко не о 'десяти микросекундах'. Короче, нужны именно константы.
Код:
зачем вычислять константу? Что Вам мешает посчитать Ваши цифры заранее?
1. Человеческий фактор (я могу ошибиться)
2. Если структура типа изменится (а она изменится. тип данных - это запись, поля которой добавляются по ходу разработки программы), то есть вероятность забыть пересчитать эти константы.
3. При ручном расчете 99,999999999% возникнут проблемы при портировании кода в иную среду разработки.
4. Размер структуры зависит от размера указателя (некоторые поля - это указатели). Ясен пень, что при компиляции на x64 придется всё пересчитывать.
Зачем мне все эти проблемы, если можно просто посчитать константу на этапе компиляции.
Подобная арифметика может понадобится и на этапе выполнения. Приятно иметь более рациональное решением, хотя действительно это может не иметь особого смысла с точки зрения оптимизации и удобочитаемости (можно и коммент поставить). Вопрос не 'зачем', а 'как написать короче'? Ну, типа задачка для пытливых умов. Мне вот ничё толкового в головы не идет. Может кому придёт.
Sibedir вне форума Ответить с цитированием
Старый 21.02.2013, 13:51   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
1. Человеческий фактор (я могу ошибиться)
Вы можете ошибиться и в другом месте, наймите программиста и он сделает все в лучшем виде. Надеюсь Вы понимаете абсурдность данного аргумента? Вы же итак ошиблись, разве нет?
Цитата:
2. Если структура типа изменится (а она изменится. тип данных - это запись, поля которой добавляются по ходу разработки программы), то есть вероятность забыть пересчитать эти константы.
Конечно, комментарии пишут только слабаки.
Цитата:
3. При ручном расчете 99,999999999% возникнут проблемы при портировании кода в иную среду разработки.
Они у Вас возникнут в любом случае, независимо от того будете ли Вы вручную считать константы или переписывать процедуру/функцию.
Цитата:
4. Размер структуры зависит от размера указателя (некоторые поля - это указатели). Ясен пень, что при компиляции на x64 придется всё пересчитывать.
Зачем мне все эти проблемы, если можно просто посчитать константу на этапе компиляции.
Ну да, приложить лист Экзеля это будет вообще не по-фень-шую.
Вы обратили внимание к чему я придираюсь? Ваши проблемы связаны с тараканами в голове, а не с реальной ситуацией (которая и выеденного яица не стоит).
Цитата:
Вопрос не 'зачем', а 'как написать короче'?
Оно как правило тесно взаимосвязано.
Serge_Bliznykov дал оптимальный вариант. Короткий, понятный и самый быстрый.
Лично я бы использовал переменные, которые бы инициализировались от данных констант.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 21.02.2013, 13:56   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Utkin, замечания приняты. Тараканов шугать периодически нужно, согласен

Ну так есть у кого более короткая запись?

P.S.: Модераторам: В принципе, тему можно и в другой раздел перенести, я не против.
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Деление нацело с округлением в большую сторону NioTo Паскаль, Turbo Pascal, PascalABC.NET 25 11.10.2013 14:14
Функция округления в большую сторону в c++ Karina89 Помощь студентам 1 23.11.2011 18:02
Помогите сместить большую картинку на кнопке SpeedButton1 DemonXT Компоненты Delphi 4 19.11.2009 15:28
Округление в большую или меньшую сторону Shokoladniu Microsoft Office Excel 5 15.10.2009 17:37
Задача на большую строку Witaliy Помощь студентам 4 10.02.2009 18:26