Битые 11 минут сижу просматриваю чистейший участок кода на наличие синтаксических ошибок.
Нет их и все!
Сначала думал, что это все из-за того, что который час сижу сонный перед монитором, и все же не замечаю какой-либо ошибки.
Настораживает одно - компилятор выводит явный бред в описании ошибки (ссылается на строку кода, указывая что там используется необъявленная переменная, хотя она объявлена, причем синтаксически верно, и в указанной строке не используется).
Но чудом :) удается обнаружить - исходник содержит Lf-окончания строк. Оказывается компилятор, что в MSVS, сходит от этого с ума, как и я при поиске несуществующей ошибки.
понедельник, 22 марта 2010 г.
Расчет необходимой мощности блока питания ПК
Все вот хочу добавить еще один винчестер в свой декстоп, но не знаю хватит ли мощности БП. Оказалось, существует удобный калькулятор, который должен помочь в решении вопроса.
воскресенье, 14 марта 2010 г.
Построение UML диаграмм онлайн
Наткнулся на интересный сервис для построения UML диаграмм онлайн. Для первой лабы по АРПО годится! :)
суббота, 6 марта 2010 г.
О пользе System.Reflection
Честно говоря, первый раз столкнувшись с рефлексией в .NET, я думал: "Ну это точно можно пролистать, вряд ли быстро пригодится!".
Все оказалось иначе, а все из-за...
Есть задача.
Некий Executor выполняет команды, идентифицируемые строковыми именами.
Понятно, чтобы выполнить запрос на экзекуцию :) команды по ее имени, нужно иметь какой-то словарь этих самых команд. Хорошо, заводим словарь и метод для его пополнения AddCommand(string, Command).
А вот теперь вопрос: кто, где и когда должен вызывать этот метод?
Ага, нет проблем! Ведь можно <здесь перечисление вариантов>!
Но проблема в том, что многие из этих вариантов будут лишены гибкости, а это, как показывает опыт, плохо (или по крайней мере не очень хорошо).
Теперь один из приемлемых, как по мне, вариантов решения.
Создаем атрибут CommandAttribute, наделяя его полем CommandName. Этот атрибут применяется ко всем потомкам абстрактного Command.
В конструктор класса Executor помещаем код, который:
1. Получает массив сборок текущего домена:
Все оказалось иначе, а все из-за...
Есть задача.
Некий Executor выполняет команды, идентифицируемые строковыми именами.
Понятно, чтобы выполнить запрос на экзекуцию :) команды по ее имени, нужно иметь какой-то словарь этих самых команд. Хорошо, заводим словарь и метод для его пополнения AddCommand(string, Command).
А вот теперь вопрос: кто, где и когда должен вызывать этот метод?
Ага, нет проблем! Ведь можно <здесь перечисление вариантов>!
Но проблема в том, что многие из этих вариантов будут лишены гибкости, а это, как показывает опыт, плохо (или по крайней мере не очень хорошо).
Теперь один из приемлемых, как по мне, вариантов решения.
Создаем атрибут CommandAttribute, наделяя его полем CommandName. Этот атрибут применяется ко всем потомкам абстрактного Command.
В конструктор класса Executor помещаем код, который:
1. Получает массив сборок текущего домена:
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies ();2. Для каждого типа каждой сборки получает массив атрибутов:
CommandAttribute[] attributes = (CommandAttribute[])type.GetCustomAttributes (typeof(CommandAttribute), false);3. Использует конструктор типа, если массив его атрибутов содержит нужный нам CommandAttribute, а также если тип унаследован от Command:
ConstructorInfo ctor = type.GetConstructor (new Type[] { typeof(string[]) });
AddCommand ((ICommand)ctor.Invoke (new object[] { commandAliases }));
Гибкость налицо: для создания новой команды необходимо просто унаследовать класс от абстрактного Command и добавить атрибут CommandAttribute - это все, больше ничего лишнего.
понедельник, 11 января 2010 г.
CUDA, Windows 7, TDR
Была задача, которую нужно было решить с использованием CUDA дабы достичь ускорения.
Ок, пишем реализацию, запускаем на более-менее серьезном массиве данных и получаем "Display driver stopped responding and has recovered".
Все дело в Timeout Detection and Recovery (TDR) - ядро не должно исполняться более 2 сек - это известная проблема (NVIDIA CUDA Windows XP and Vista Release Notes Version 2.3, Known Issues).
Одно из решений (возможно не самое лучшее, но работающее) - создать в HKLM\System\CurrentControlSet\Control\GraphicsDrivers ключ TdrLevel типа DWORD со значением 0 (TdrLevelOff). Следует обратить внимание на то, что этот ключ реестра документирован только в целях тестирования, более подробно тут.
Ок, пишем реализацию, запускаем на более-менее серьезном массиве данных и получаем "Display driver stopped responding and has recovered".
Все дело в Timeout Detection and Recovery (TDR) - ядро не должно исполняться более 2 сек - это известная проблема (NVIDIA CUDA Windows XP and Vista Release Notes Version 2.3, Known Issues).
Одно из решений (возможно не самое лучшее, но работающее) - создать в HKLM\System\CurrentControlSet\Control\GraphicsDrivers ключ TdrLevel типа DWORD со значением 0 (TdrLevelOff). Следует обратить внимание на то, что этот ключ реестра документирован только в целях тестирования, более подробно тут.
суббота, 26 декабря 2009 г.
Все не так просто с высотой комбобокса (WinAPI)
На днях пришлось добавить комбобокс в древнюю софтину с GUI на Win32 API. Комбобокс этот должен входить в состав диалога, описанного в ресурсах. Ок, мне оставалось только добавить код, наполняющий этот комбобокс, и обработчик выбора элемента.
Все бы хорошо, но выпадающий список не появлялся! При этом GetLastError() == 0 и SendMessage(..., CB_ADDSTRING, ...) != CB_ERR после предварительного SetLastError(ERROR_SUCCESS).
О-о-о... Мне стоило полтора десятка минут повозиться с этой ерундой, меняя стили, коды возврата на разные сообщения и т. д. и т. п., пытаясь заставить список выпасть, прежде чем я обнаружил, что значение высоты, указанное при декларации комбобокса в ресурсах определяет не только высоту непосредственно поля ввода, но и вместе с ним высоту выпадающего списка. Ох уж этот ужасный код, реализующий GUI на чистом Win32 API... :)
Все бы хорошо, но выпадающий список не появлялся! При этом GetLastError() == 0 и SendMessage(..., CB_ADDSTRING, ...) != CB_ERR после предварительного SetLastError(ERROR_SUCCESS).
О-о-о... Мне стоило полтора десятка минут повозиться с этой ерундой, меняя стили, коды возврата на разные сообщения и т. д. и т. п., пытаясь заставить список выпасть, прежде чем я обнаружил, что значение высоты, указанное при декларации комбобокса в ресурсах определяет не только высоту непосредственно поля ввода, но и вместе с ним высоту выпадающего списка. Ох уж этот ужасный код, реализующий GUI на чистом Win32 API... :)
четверг, 17 декабря 2009 г.
Вот так метель!
Уверен, что сегодняшний день запомнится многим дончанам!

Великолепная метель сопровождала меня практически весь день. Давно погода не дарила такого ощущения бодрости и веселья - настоящая зима!

На трамвайной остановке скопилось довольно много людей в ожидании транспорта.
Буквально через 3-5 мин, медленно выезжая из заснеженного пространства, показался первый трамвай.

К первой паре прибыл почти вовремя, на вторую (из 3-го корпуса в 4-й) решил пройтись пешком, такую погоду нельзя пропускать!

Автомобилей сегодня поменьше обычного - еще один аргумент в пользу пешей прогулки.

Метель скрыла привычный вид из восьмерки на парк Щербакова.

Последняя пара окончена, пора домой. Разве не прекрасна такая погода? Идем пешком!


Настроение все более приближается к новогоднему :).


Я доволен своим статусом пешехода!



Транспорт на Ленинском стал, что поспособствовало увеличению количества пешеходов - длинная вереница бывших пассажиров растянулась от Южного до ул. Куйбышева.

Безусловно, не для всех такая погода принесла только лишь радость, но тем не менее я люблю такую зиму, и сегодняшний день оказался настоящим сказочным радующим глаз декабрьским!
P. S. Фото кликабельны.

Великолепная метель сопровождала меня практически весь день. Давно погода не дарила такого ощущения бодрости и веселья - настоящая зима!

На трамвайной остановке скопилось довольно много людей в ожидании транспорта.
Буквально через 3-5 мин, медленно выезжая из заснеженного пространства, показался первый трамвай.

К первой паре прибыл почти вовремя, на вторую (из 3-го корпуса в 4-й) решил пройтись пешком, такую погоду нельзя пропускать!

Автомобилей сегодня поменьше обычного - еще один аргумент в пользу пешей прогулки.

Метель скрыла привычный вид из восьмерки на парк Щербакова.

Последняя пара окончена, пора домой. Разве не прекрасна такая погода? Идем пешком!


Настроение все более приближается к новогоднему :).


Я доволен своим статусом пешехода!



Транспорт на Ленинском стал, что поспособствовало увеличению количества пешеходов - длинная вереница бывших пассажиров растянулась от Южного до ул. Куйбышева.

Безусловно, не для всех такая погода принесла только лишь радость, но тем не менее я люблю такую зиму, и сегодняшний день оказался настоящим сказочным радующим глаз декабрьским!
P. S. Фото кликабельны.
Подписаться на:
Сообщения (Atom)