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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2013, 14:20   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ну вот чуть покороче, тоже с тараканами
Код:
_SIZE_TEST1 = Trunc((SizeOf_Test1+_ROUND_SIZE-1)/_ROUND_SIZE)*_ROUND_SIZE;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.02.2013, 14:33   #12
superedward
Форумчанин
 
Аватар для superedward
 
Регистрация: 27.11.2012
Сообщений: 190
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
да, кстати, мне тоже непонятно, кто мешает написать так?!
Это всего лишь тесты для проверки функции.
Выражения с константами вычисляются во время компиляции программы, так что ваш спор беспредметен.
superedward вне форума Ответить с цитированием
Старый 24.02.2013, 00:27   #13
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Цитата:
Выражения с константами вычисляются во время компиляции программы,
Во умник нашелся, если бы все так просто было, ТС не создавал бы тему. Не все константы вычисляются так легко и просто, а только примитивные выражения. А это не тот случай.
Цитата:
так что ваш спор беспредметен.
Прочтите внимательно о чем идет речь, прежде чем делать такие заявления...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 24.02.2013, 08:35   #14
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,281
По умолчанию

Мне кажется, superedward, прав. ВСЕ константы вычисляются на этапе компиляции. Но дело вовсе не в этом.
Цитата:
Сообщение от sibdeir
Вопрос не 'зачем', а 'как написать короче'? Ну, типа задачка для пытливых умов. Мне вот ничё толкового в головы не идет. Может кому придёт.
И
Цитата:
Сообщение от sibdeir
Подобная арифметика может понадобится и на этапе выполнения.
Sibedir вне форума Ответить с цитированием
Старый 25.02.2013, 00:40   #15
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
ВСЕ константы вычисляются на этапе компиляции.
Да, именно так. А можно поинтересоваться, в какой прикладной задаче понадобилось вычислять округленные значения в исходных единицах, а не в _ROUND_SIZE-ах?

Наиболее типичная задача такого рода -- нахождение целого числа кластеров для размещения файла заданного размера. Но в этом случае искомое число -- именно число кластеров, а не округленная длина в байтах.

В разрезе системного программирования я посчитал эту задачу настолько типичной, что решил ввести в разрабатываемый мной язык отдельную операцию -- деление с учетом остатка, обозначаемую как +/. На Оно пример будет выглядеть так:
Код:
  SizeOf_Test1 = 31;
  SizeOf_Test2 = 32;
  SizeOf_Test3 = 33;
  SizeOf_Test4 = 871;
  SizeOf_Test5 = 528;

  _ROUND_SIZE = 16;
  _SIZE_TEST1 = (SizeOf_Test1 +/ _ROUND_SIZE) * _ROUND_SIZE;
  _SIZE_TEST2 = (SizeOf_Test2 +/ _ROUND_SIZE) * _ROUND_SIZE;
  _SIZE_TEST3 = (SizeOf_Test3 +/ _ROUND_SIZE) * _ROUND_SIZE;
  _SIZE_TEST4 = (SizeOf_Test4 +/ _ROUND_SIZE) * _ROUND_SIZE;
  _SIZE_TEST5 = (SizeOf_Test5 +/ _ROUND_SIZE) * _ROUND_SIZE;
Задумался даже о введении операции округления без деления, все равно +* свободен. Тогда будет еще проще:
Код:
  _SIZE_TEST1 = SizeOf_Test1 +* _ROUND_SIZE;
А в Паскале/Delphi расчет кластеров обычно записывают так:
Код:
var
  ClusterCount := (FileBytes + ClusterBytes - 1) div ClusterBytes;
Vapaamies вне форума Ответить с цитированием
Старый 25.02.2013, 06:07   #16
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,281
По умолчанию

Цитата:
Да, именно так. А можно поинтересоваться, в какой прикладной задаче понадобилось вычислять округленные значения в исходных единицах, а не в _ROUND_SIZE-ах?
Упражнялся по выравниванию данных на Lazarus. Не могу вкурить как заставить его выравнивать по заданное значение. {$Align 8} и {$PACKRECORDS 8} не работают. Компилятор их съедает но не реагирует.
А сам вопрос возник из чистого любопытства.
Как можно короче записать?
И
Как можно записать, чтобы на этапе выполнения работало быстрее?
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