![]() |
|
Модераторы: bsa |
![]()
|
|
| Hagrael |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Здравствуйте. В учебнике по WinAPI от Петзолда (кстати, замечательный учебник!) код тела оконной процедуры приведен в подобном виде:
Но ведь данный код при каждом вызове оконной процедуры (а их ведь в приличных программах совсем немало!) будет создавать переменные, причем не простые переменные, а структуры! Это же жуткая задержка! Почему бы не делать так:
И почему компилятор ругается на такую запись:
т. е. на запись без фигурных скобок? Говорит: error: jump to case label error: crosses initialization of 'int a' Заранее благодарен. |
||||||
|
|||||||
| vedr |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 12.8.2011 Репутация: нет Всего: нет |
Оконная процедура вызывается когда ОС кидает приложению сообщения. Ну например, приходит десяток сообщений в секунду, это совсем немного, а структуры - элементарные (несколько POD - типов). На саму перерисовку окна тратится несравнимо больше времени.
скорее всего он видит единичку в 10 и хочет перейти на case 1 сделайте так:
|
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
||||
|
||||
| Cheloveck |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 5 Всего: 32 |
Правильно делать так
Объявление переменных должно быть в блоке кода. Создай его в кейсе и будет тебе счастье
-------------------- ![]() |
||||
|
|||||
| spyswamp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 349 Регистрация: 18.8.2006 Репутация: 1 Всего: 7 |
Cheloveck, да, в каждом кейсе нужен свой скоп, чтобы можно было объявлять переменные.
-------------------- - why you call it beta? - cuz it's betta then nothin' |
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
||||
|
||||
| spyswamp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 349 Регистрация: 18.8.2006 Репутация: 1 Всего: 7 |
Hagrael, ну, начнем с того, что это оператор... http://www.cyberguru.ru/programming/cpp/cp...way-page61.html
-------------------- - why you call it beta? - cuz it's betta then nothin' |
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Но если можно создать переменную, а после ее инициализировать, то почему же нельзя создать и инициализировать переменную одновременно?
|
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 5 Всего: 32 |
Hagrael, потому что время жизни этой переменной будет не определено.
-------------------- ![]() |
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Cheloveck, я не улавливаю связь между тем, инициализировать переменную сразу или нет, и временем ее жизни
|
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Hagrael, рассмотрим такой вариант
Здесь идет обращение к "а", без ее создания, так как создание (и иниц-ия) находится в коде который не выполняется. Чтоб избежать такого поведения, компилятор не будет компилировать такой код, где переменные могут быть использованы без создания. Так вот, switch - это по сути тот же самый goto, только оформлен по другому. Стоит-ли продолжать дальше ... ? |
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Понятно. Значит, компилятор самостоятельно не в состоянии разделить процесс создания переменной и присвоения ей значения. Но отсюда вытекает новый вопрос: не уже ли инициализация в корне отличается от последовательного создания переменной и ее заполнения?
|
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 5 Всего: 32 |
Hagrael, C++ поддерживает инициализацию при объявлении и поощряет это. Но объявление переменной в switch невозможно без создания блока кода. Два или более кейсов switch будут выполняться подряд, если не будет явного указания на выход из оператора. По этой причине, компилятор не может догадаться о времени жизни переменной. Ты можешь создать в двух кейсах две переменные с одним именем. Компилятор не сможет их разрешить, если break указан не будет.
Добавлено через 1 минуту и 46 секунд
Добавлено через 4 минуты и 47 секунд http://codepad.org/eGMeXzmn -------------------- ![]() |
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
В общем, понятно.
|
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
В общем случае - да. Особенно это заметно для экземпляров объектов и ссылок.
|
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |