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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2012, 23:56   #11
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Код:
void CWinDisplay::SetTitle(const std::string& text)const
{ 
    if( MEMBERS.mTitle==text) return;
    MEMBERS.mTitle=text;

    #ifdef UNICODE
        #pragma message("CWinDisplay::SetTitle():  UNICODE")
        wchar_t *buf = new wchar_t[text.length() + 1];
        MultiByteToWideChar(CP_ACP, 0, text.c_str(), -1, buf, text.length() + 1);
        SetConsoleTitle( buf ); 
        delete [] buf;
    #else
        #pragma message("CWinDisplay::SetTitle():  multibyte")
        char *buf = new char[text.length() + 1];
        CharToOem(text.c_str(),buf );
        SetConsoleTitle( buf ); 
        delete [] buf;
    #endif 
}
Конечно, таблица кодировки критична. и да обычно если пишут на UNICODE.
то использовать желательно std::wstring... он построен на базе
Код:
std:base_string<wchar_t*> wstring;
поэтому в этой проблеме лучше реализовать 2 функции и SetConsoleTitle в UNICODE вызывает SetConsoleTitleW что в принципе не нужно вызывать перевод, что ваще сильно тормозит.

Спасибо за код.

//-----

А мне казалось указатель это целое 32 разрядное число... поэтому если использовать !s оно одинаково и с числами.... и по идеи тоже тормозит... мой компилятор Visual Studio 2012 не ругает... хоть я и пускаю анализ.. но спасибо за сведения.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 12.12.2012 в 00:00.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 00:24   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Конечно, таблица кодировки критична. и да обычно если пишут на UNICODE.
то использовать желательно std::wstring... он построен на базе
ты можешь работать с std::cout в любой кодировке, и ему похрен. Он проглотит любою херь

Так же и с остальными механизмами ввода-вывода. Это их трудности, как правильно чего преобразовать. Не нужны никакие std::wstring


Цитата:
Сообщение от Perchik71 Посмотреть сообщение
перевод, что ваще сильно тормозит.
В приведенной выше функции, происходит установка заголовка консольного окна средствами WINAPI.

Ну так вот, профайлер показал, что запуск WINAPI SetConsoleTitle
сожрал 99% времени, по сравнению с запусками остальных функций.
Это если сложить запуски других WINAPI + вся работа бизнес приложения.

Перевод занимает копейки. Большую часть времени сжирает ввод-вывод. Взаимодействие с ОС.

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
А мне казалось указатель это целое 32 разрядное число... поэтому если использовать !s оно одинаково и с числами.... и по идеи тоже тормозит... мой компилятор Visual Studio 2012 не ругает... хоть я и пускаю анализ.. но спасибо за сведения.
Указатель это не 32 битное число. И тем более не тип size_t

Принудительно можно к нему привестись. Но это:

1. Сбивает компиль с толку. Старадают его возможности в оптимизации
2. При переходе на 64 битную платформу все поломается и покрешеццо.
Потому что на 64 битных платформах sizeof(void*) != sizeof(size_t)
_Bers вне форума Ответить с цитированием
Старый 12.12.2012, 00:34   #13
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
1. Сбивает компиль с толку. Старадают его возможности в оптимизации
2. При переходе на 64 битную платформу все поломается и покрешеццо.
Потому что на 64 битных платформах sizeof(void*) != sizeof(size_t)
там уже адресация памяти 64 разрядная я в курсах... но int в 64 проге тоже 64 разрядный.. он одинаков как и int64 будет. Ну то что ос много кушает это да. ещё учитывая кучу библиотечных функций вшитые в .dll. Ну лан.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 00:56   #14
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
там уже адресация памяти 64 разрядная я в курсах... но int в 64 проге тоже 64 разрядный.. он одинаков как и int64 будет. Ну то что ос много кушает это да. ещё учитывая кучу библиотечных функций вшитые в .dll. Ну лан.
Это не гарантируеццо.

Код:
int a = 2;

//предупреждение компилятора: принудительное приведение к bool. Ты точно ничего не попутал?
if(!a) {...}


//никого не вводит в заблуждение
if(a>0) {...}
_Bers вне форума Ответить с цитированием
Старый 12.12.2012, 02:26   #15
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

неа... я даже через анализ кода проталкиваю... видимо warning отключён где-то. ну это уже настройки компилятора.

Тип size_t

Тип size_t - базовый беззнаковый целочисленный тип языка Си/Си++. Является результатом выполнения оператора sizeof. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива. Например, на 32-битной системе size_t будет занимать 32-бита, на 64-битной - 64-бита. Другими словами в переменную типа size_t может быть безопасно помещен указатель. Исключение составляют указатели на функции классов, но это особый случай. Тип size_t обычно применяется для счетчиков циклов, индексации массивов, хранения размеров, адресной арифметики.

Максимально допустимым значением типа size_t является константа SIZE_MAX.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 12.12.2012 в 02:34. Причина: во погуглил нашёл.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 02:44   #16
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

короче типы size_t и ptrdiff_t, были созданы, что бы программы можно было легко переносить на 64 битную машину. поскольку эти типы это гарантируют... адресная арифметика полностью защищена от переносимости системы. вопрос лишь в том, что компилятор ругается. ну да он заботиться о нашем благополучии. А так всё это суета страшная. Типы страшная головная боль. поэтому не зря придумали шаблоны.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 17:26   #17
dimidze
 
Регистрация: 10.12.2012
Сообщений: 7
По умолчанию

спасибо огромное!!!!!!!!!!!!!!очень помогли!!!!!!!!
dimidze вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дописать программу Александрq Помощь студентам 7 08.11.2012 23:00
Дописать программу на С++ до 23.07 insar Фриланс 6 20.07.2011 10:16
Дописать программу Deshrefresh Помощь студентам 0 04.12.2010 13:31
дописать программу span80 Паскаль, Turbo Pascal, PascalABC.NET 0 20.05.2010 10:15
помогите дописать программу slm Работа с сетью в Delphi 3 09.05.2008 18:39