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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оценка необходимой ширины 
:(
    Опции темы
ТарасАтавин
Дата 29.8.2013, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Шрифтом Arial с ведущими нолями в шестнадцатеричном представлении цифрами 0123456789ABCDEF выводятся номера строк, известно, сколько цифр отведено под один номер, надо оценить максимальную ширину номера, чтоб сами строки начинать гарантировано правее. Желательно не перебирать при этом сами номера от нулевого до последнего.

Это сообщение отредактировал(а) ТарасАтавин - 29.8.2013, 07:53


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
Dem_max
Дата 29.8.2013, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



GetTextExtentPoint32()


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
ТарасАтавин
Дата 29.8.2013, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Читайте: 
Цитата(ТарасАтавин @  29.8.2013,  07:52 Найти цитируемый пост)
Желательно не перебирать при этом сами номера от нулевого до последнего.
. А функцию эту я знаю и даже использую.

Это сообщение отредактировал(а) ТарасАтавин - 29.8.2013, 08:54


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
Amp
Дата 29.8.2013, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вариант выкинуть Arial и взять моноширный шрифт не подходит?
PM MAIL   Вверх
ТарасАтавин
Дата 29.8.2013, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Желательно всё таки Arial. Но мне не надо точно. Мне надо близко и с гарантией. То есть разрешается слегка ошибиться в строну увеличения, но не в строну уменьшения. Какая из моих цифр в Arial шире всех?


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
xvr
Дата 29.8.2013, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ТарасАтавин @  29.8.2013,  08:54 Найти цитируемый пост)
Читайте: 

Переберите цифры (от 0 до F), выберите с максимальной шириной, прибавьте межсимвольный промежуток и умножте на количество цифр в номере строки.

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


Крокодил
**


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

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



Переберите цифры от 0 до F для данного шрифта, которая из них окажется самой широкой, из той составьте строку с максимальным количеством цифр в номере, возьмите ширину, немного накиньте "шоб було" и задача будет решена.

Добавлено через 2 минуты и 15 секунд
Цитата(xvr @  29.8.2013,  13:03 Найти цитируемый пост)
Переберите цифры (от 0 до F), выберите с максимальной шириной, прибавьте межсимвольный промежуток и умножте на количество цифр в номере строки.


Опять я не успел!  smile 
А ведь это один из немногих вопросов, на которые я знал ответ.  smile 


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ТарасАтавин
Дата 29.8.2013, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код
 int          i;
 int          L;
 std::wstring s[16];
 SIZE         Size[16];
 s[0]=L"";
 s[1]=L"";
 s[2]=L"";
 s[3]=L"";
 s[4]=L"";
 s[5]=L"";
 s[6]=L"";
 s[7]=L"";
 s[8]=L"";
 s[9]=L"";
 s[10]=L"";
 s[11]=L"";
 s[12]=L"";
 s[13]=L"";
 s[14]=L"";
 s[15]=L"";
 L=sizeof(size_t)*2;
 for (i=L; i>0; --i)
 {
  s[0]+=L'0';
  s[1]+=L'1';
  s[2]+=L'2';
  s[3]+=L'3';
  s[4]+=L'4';
  s[5]+=L'5';
  s[6]+=L'6';
  s[7]+=L'7';
  s[8]+=L'8';
  s[9]+=L'9';
  s[10]+=L'A';
  s[11]+=L'B';
  s[12]+=L'C';
  s[13]+=L'D';
  s[14]+=L'E';
  s[15]+=L'F';
 }
 GetTextExtentPoint32W(Context, s[0].c_str(), L, &Size[0]);
 GetTextExtentPoint32W(Context, s[1].c_str(), L, &Size[1]);
 GetTextExtentPoint32W(Context, s[2].c_str(), L, &Size[2]);
 GetTextExtentPoint32W(Context, s[3].c_str(), L, &Size[3]);
 GetTextExtentPoint32W(Context, s[4].c_str(), L, &Size[4]);
 GetTextExtentPoint32W(Context, s[5].c_str(), L, &Size[5]);
 GetTextExtentPoint32W(Context, s[6].c_str(), L, &Size[6]);
 GetTextExtentPoint32W(Context, s[7].c_str(), L, &Size[7]);
 GetTextExtentPoint32W(Context, s[8].c_str(), L, &Size[8]);
 GetTextExtentPoint32W(Context, s[9].c_str(), L, &Size[9]);
 GetTextExtentPoint32W(Context, s[10].c_str(), L, &Size[10]);
 GetTextExtentPoint32W(Context, s[11].c_str(), L, &Size[11]);
 GetTextExtentPoint32W(Context, s[12].c_str(), L, &Size[12]);
 GetTextExtentPoint32W(Context, s[13].c_str(), L, &Size[13]);
 GetTextExtentPoint32W(Context, s[14].c_str(), L, &Size[14]);
 GetTextExtentPoint32W(Context, s[15].c_str(), L, &Size[15]);
 return Max(Size[0].cx, Size[1].cx, Size[2].cx, Size[3].cx, Size[4].cx, Size[5].cx, Size[6].cx, Size[7].cx, Size[8].cx, Size[9].cx, Size[10].cx, Size[11].cx, Size[12].cx, Size[13].cx, Size[14].cx, Size[15].cx);



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
Dem_max
Дата 29.8.2013, 15:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ТарасАтавин @ 29.8.2013,  14:50)
Код
 int          i;
 int          L;
 std::wstring s[16];
 SIZE         Size[16];
 s[0]=L"";
 s[1]=L"";
 s[2]=L"";
 s[3]=L"";
 s[4]=L"";
 s[5]=L"";
 s[6]=L"";
 s[7]=L"";
 s[8]=L"";
 s[9]=L"";
 s[10]=L"";
 s[11]=L"";
 s[12]=L"";
 s[13]=L"";
 s[14]=L"";
 s[15]=L"";
 L=sizeof(size_t)*2;
 for (i=L; i>0; --i)
 {
  s[0]+=L'0';
  s[1]+=L'1';
  s[2]+=L'2';
  s[3]+=L'3';
  s[4]+=L'4';
  s[5]+=L'5';
  s[6]+=L'6';
  s[7]+=L'7';
  s[8]+=L'8';
  s[9]+=L'9';
  s[10]+=L'A';
  s[11]+=L'B';
  s[12]+=L'C';
  s[13]+=L'D';
  s[14]+=L'E';
  s[15]+=L'F';
 }
 GetTextExtentPoint32W(Context, s[0].c_str(), L, &Size[0]);
 GetTextExtentPoint32W(Context, s[1].c_str(), L, &Size[1]);
 GetTextExtentPoint32W(Context, s[2].c_str(), L, &Size[2]);
 GetTextExtentPoint32W(Context, s[3].c_str(), L, &Size[3]);
 GetTextExtentPoint32W(Context, s[4].c_str(), L, &Size[4]);
 GetTextExtentPoint32W(Context, s[5].c_str(), L, &Size[5]);
 GetTextExtentPoint32W(Context, s[6].c_str(), L, &Size[6]);
 GetTextExtentPoint32W(Context, s[7].c_str(), L, &Size[7]);
 GetTextExtentPoint32W(Context, s[8].c_str(), L, &Size[8]);
 GetTextExtentPoint32W(Context, s[9].c_str(), L, &Size[9]);
 GetTextExtentPoint32W(Context, s[10].c_str(), L, &Size[10]);
 GetTextExtentPoint32W(Context, s[11].c_str(), L, &Size[11]);
 GetTextExtentPoint32W(Context, s[12].c_str(), L, &Size[12]);
 GetTextExtentPoint32W(Context, s[13].c_str(), L, &Size[13]);
 GetTextExtentPoint32W(Context, s[14].c_str(), L, &Size[14]);
 GetTextExtentPoint32W(Context, s[15].c_str(), L, &Size[15]);
 return Max(Size[0].cx, Size[1].cx, Size[2].cx, Size[3].cx, Size[4].cx, Size[5].cx, Size[6].cx, Size[7].cx, Size[8].cx, Size[9].cx, Size[10].cx, Size[11].cx, Size[12].cx, Size[13].cx, Size[14].cx, Size[15].cx);

Ужос  smile 
Код из 5 строчек превратить в 200


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
akizelokro
Дата 29.8.2013, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Йолки! а это что такое? Есть же форматирование чисел для представления в виде текста.
Вот код перебора:

Код

WCHAR buffer[32];
int number = 0;
int max_width = 0;
for (int i = 0x00; i < 17; i++)
{
      wsprintf(buffer, "%x", i);
      CSize size = pDC->GetTextExtent(buffer);
      if(size.cx > max_width)
     {
             number = i;
            max_width = size.cx;
     }
}



таким образом получаешь число, которые шире остальным в данном контексте устройства (или шрифт смени для CDC или замени функцию GetTextExtent на ту, которая тебе удобней.  Дальше уже работаешь с этим числом.
И не лень тебе было всё это сверху писать?

Ладно, научишься, будешь быстро потом всё делать. Новый язык всегда в принципе со скрипом осваивается

Это сообщение отредактировал(а) akizelokro - 29.8.2013, 15:29


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ТарасАтавин
Дата 29.8.2013, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(akizelokro @  29.8.2013,  15:22 Найти цитируемый пост)
Вот код перебора:
Вот как раз спринтф и есть ужас. Даже с учётом заранее вычисленного размера буфера. Кроме того, я избавился от лишних вложенных вызовов. И не полагаюсь на умножение ширины отдельного символа.

Добавлено через 3 минуты и 44 секунды
Цитата(akizelokro @  29.8.2013,  15:22 Найти цитируемый пост)
И не лень тебе было всё это сверху писать?
Я вообще люблю "вручную" перебирать массивы от 512-ти элементов, а такой малышь - это у меня впервые.


Это сообщение отредактировал(а) ТарасАтавин - 29.8.2013, 16:12


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
akizelokro
Дата 29.8.2013, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(ТарасАтавин @  29.8.2013,  16:11 Найти цитируемый пост)
Вот как раз спринтф и есть ужас. Даже с учётом заранее вычисленного размера буфера. Кроме того, я избавился от лишних вложенных вызовов. И не полагаюсь на умножение ширины отдельного символа.


Это понятно, что у всех программистов есть свои привычки. Когда же работаешь в команде или пишешь код, который будет потом сопровождаться годами и сопровождаться, возможно, другими людьми, то начинают играть роли другие сущности.
Первая из них это логичность кода. У меня, когда я гляну на этот код, первое что возникнет в мыслях, что там какой-то убойный алгоритм, который ну никак нельзя было упростить. Тут я сам исхожу из тех же простых причин, что применение алгоритма должно быть оправдано исходя из логики программы и зависящей от этого читабельностью. И если я там вижу массив из множества элементов, то думаю, что это так и должно быть (ввиду логического принципа бритвы Оккама).

И не предлагал я умножать на ширину. У меня было предложение собрать строку из n символов с максимальной шириной и взять её реальный размер. Возможно, это несколько нерациональней.

Не говоря уже о том, что время деньги и ты мог бы потратить время ещё на чо-то рациональней.

Это сообщение отредактировал(а) akizelokro - 29.8.2013, 18:34


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ТарасАтавин
Дата 29.8.2013, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(akizelokro @  29.8.2013,  18:32 Найти цитируемый пост)
Это понятно, что у всех программистов есть свои привычки. Когда же работаешь в команде или пишешь код, который будет потом сопровождаться годами и сопровождаться, возможно, другими людьми, то начинают играть роли другие сущности.
Не другие, а именно эти. Надёжность и безопасность кода не имеет значения, если он будет выброшен к вечеру. И тогда можно юзать спринтфы, сканфы и тому подобный ужас. Если же код должен поддерживаться хотябы неделю, то можно юзать только те функции, которые или сами заботятся о буферах, или спрашивают их размеры в параметрах.

Добавлено через 2 минуты и 18 секунд
Цитата(akizelokro @  29.8.2013,  18:32 Найти цитируемый пост)
У меня было предложение собрать строку из n символов с максимальной шириной и взять её реальный размер. Возможно, это несколько нерациональней.
А я что сделал?


Это сообщение отредактировал(а) ТарасАтавин - 29.8.2013, 19:16


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
akizelokro
Дата 30.8.2013, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(ТарасАтавин @  29.8.2013,  19:15 Найти цитируемый пост)
Не другие, а именно эти. Надёжность и безопасность кода не имеет значения, если он будет выброшен к вечеру. И тогда можно юзать спринтфы, сканфы и тому подобный ужас. Если же код должен поддерживаться хотябы неделю, то можно юзать только те функции, которые или сами заботятся о буферах, или спрашивают их размеры в параметрах.


Есть и безопасные версии у sprintf, и прочих подобных Сшных функций. Если есть желание, то можно использовать их. Если нет желания использовать их ввиду других причин, то можно искать аналоги (обсуждение темы у Слэтера в "Новые сложные задачи на С++) почти в самом начале книги. 
Лично же у меня представление о безопасности кода (при переносимости), действительно, несколько своеобразное.  В нём я исхожу из законов Мёрфи в не меньшей степени представляя это так, что обязательно найдутся некие программисты, которые при модификации кода сделают в нём ошибки всевозможного характера. И, понимая это, от части окончательных проверок ухожу, потому что некий программист сможет обойти все проверки и превратить работающий код в генерирующий ошибки.


Цитата

А я что сделал?

А не знаю. Я увидел большое количество строк, в которых шло обращение ко всем элементам массива, я понял, что это что-то мощное и потрясенный глубиной замысла творца, я поверил ему на "слово", не разбираясь в деталях этого внушительного сооружения  smile 


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
akizelokro
Дата 30.8.2013, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



В той части своей подоплёки, в которой являюсь мистиком, я с глубоким душевным трепетом наблюдаю за воистину мистическим отражением тенденций разнообразия Универсума, как то в плане воплощения бесконечного множества ошибок, реализуемого неким абстрактным программистом в конкретных кусках кода, так и полумистической борьбой с бесконечным множеством ошибок, ведущейся некими конкретными программистами, и подозреваю в этом не только отражения глубинных тенденций Универсума, но и проявление его бесконечной мощности как некоего множества. smile 

Это сообщение отредактировал(а) akizelokro - 30.8.2013, 07:28


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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