| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Оценка необходимой ширины |
| Автор: ТарасАтавин 29.8.2013, 07:52 |
| Шрифтом Arial с ведущими нолями в шестнадцатеричном представлении цифрами 0123456789ABCDEF выводятся номера строк, известно, сколько цифр отведено под один номер, надо оценить максимальную ширину номера, чтоб сами строки начинать гарантировано правее. Желательно не перебирать при этом сами номера от нулевого до последнего. |
| Автор: Dem_max 29.8.2013, 07:58 |
| GetTextExtentPoint32() |
| Автор: ТарасАтавин 29.8.2013, 08:54 |
| Читайте: . А функцию эту я знаю и даже использую. |
| Автор: Amp 29.8.2013, 11:01 |
| Вариант выкинуть Arial и взять моноширный шрифт не подходит? |
| Автор: ТарасАтавин 29.8.2013, 11:20 |
| Желательно всё таки Arial. Но мне не надо точно. Мне надо близко и с гарантией. То есть разрешается слегка ошибиться в строну увеличения, но не в строну уменьшения. Какая из моих цифр в Arial шире всех? |
| Автор: xvr 29.8.2013, 13:03 |
Переберите цифры (от 0 до F), выберите с максимальной шириной, прибавьте межсимвольный промежуток и умножте на количество цифр в номере строки. |
| Автор: ТарасАтавин 29.8.2013, 14:50 | ||
|
| Автор: Dem_max 29.8.2013, 15:09 | ||||
Ужос Код из 5 строчек превратить в 200 |
| Автор: akizelokro 29.8.2013, 15:22 | ||
| Йолки! а это что такое? Есть же форматирование чисел для представления в виде текста. Вот код перебора:
таким образом получаешь число, которые шире остальным в данном контексте устройства (или шрифт смени для CDC или замени функцию GetTextExtent на ту, которая тебе удобней. Дальше уже работаешь с этим числом. И не лень тебе было всё это сверху писать? Ладно, научишься, будешь быстро потом всё делать. Новый язык всегда в принципе со скрипом осваивается |
| Автор: ТарасАтавин 29.8.2013, 16:11 |
| Вот как раз спринтф и есть ужас. Даже с учётом заранее вычисленного размера буфера. Кроме того, я избавился от лишних вложенных вызовов. И не полагаюсь на умножение ширины отдельного символа. Добавлено через 3 минуты и 44 секунды Я вообще люблю "вручную" перебирать массивы от 512-ти элементов, а такой малышь - это у меня впервые. |
| Автор: akizelokro 29.8.2013, 18:32 | ||
Это понятно, что у всех программистов есть свои привычки. Когда же работаешь в команде или пишешь код, который будет потом сопровождаться годами и сопровождаться, возможно, другими людьми, то начинают играть роли другие сущности. Первая из них это логичность кода. У меня, когда я гляну на этот код, первое что возникнет в мыслях, что там какой-то убойный алгоритм, который ну никак нельзя было упростить. Тут я сам исхожу из тех же простых причин, что применение алгоритма должно быть оправдано исходя из логики программы и зависящей от этого читабельностью. И если я там вижу массив из множества элементов, то думаю, что это так и должно быть (ввиду логического принципа бритвы Оккама). И не предлагал я умножать на ширину. У меня было предложение собрать строку из n символов с максимальной шириной и взять её реальный размер. Возможно, это несколько нерациональней. Не говоря уже о том, что время деньги и ты мог бы потратить время ещё на чо-то рациональней. |
| Автор: ТарасАтавин 29.8.2013, 19:15 | ||||
Добавлено через 2 минуты и 18 секунд
|
| Автор: akizelokro 30.8.2013, 06:29 | ||||
Есть и безопасные версии у sprintf, и прочих подобных Сшных функций. Если есть желание, то можно использовать их. Если нет желания использовать их ввиду других причин, то можно искать аналоги (обсуждение темы у Слэтера в "Новые сложные задачи на С++) почти в самом начале книги. Лично же у меня представление о безопасности кода (при переносимости), действительно, несколько своеобразное. В нём я исхожу из законов Мёрфи в не меньшей степени представляя это так, что обязательно найдутся некие программисты, которые при модификации кода сделают в нём ошибки всевозможного характера. И, понимая это, от части окончательных проверок ухожу, потому что некий программист сможет обойти все проверки и превратить работающий код в генерирующий ошибки.
А не знаю. Я увидел большое количество строк, в которых шло обращение ко всем элементам массива, я понял, что это что-то мощное и потрясенный глубиной замысла творца, я поверил ему на "слово", не разбираясь в деталях этого внушительного сооружения |
| Автор: akizelokro 30.8.2013, 07:24 |
| В той части своей подоплёки, в которой являюсь мистиком, я с глубоким душевным трепетом наблюдаю за воистину мистическим отражением тенденций разнообразия Универсума, как то в плане воплощения бесконечного множества ошибок, реализуемого неким абстрактным программистом в конкретных кусках кода, так и полумистической борьбой с бесконечным множеством ошибок, ведущейся некими конкретными программистами, и подозреваю в этом не только отражения глубинных тенденций Универсума, но и проявление его бесконечной мощности как некоего множества. |
| Автор: ТарасАтавин 30.8.2013, 08:11 |
| Я сгенерил 16 возможных номеров, имеющих одно свойство: в каждом номере все цифры одинаковы. Ширина символа ведь не зависит от соседних цифр, всё таки лигатура - отдельный составной символ, так что номер из одних максимально широких символов и будет максимально широким. Далее я измерил экранные размеры всех этих строк и выбрал из них максимальную ширину. Это легко читается, в отличие от монструозных кодов в первом параметре спринтфа, из-за каждого из которых надо месяц рыть справочник кодов. При этом непредстказуемое поведение системы при переполнении буферов исключено тем же самым отказом от спринтфа. |
| Автор: akizelokro 30.8.2013, 10:24 | ||||
Ну даже если так, то всё равно нечитабельно.
выглядит гораздо понятней. и генерирование очередной строки можно делать в цикле. и не надо столько писанины |
| Автор: ТарасАтавин 2.9.2013, 05:12 |
| Что не читабельного? Функция Max? |
| Автор: Dem_max 2.9.2013, 05:47 | ||
Это просто пи...детс.... |