среда, 31 октября 2007 г.

Dll на .NET

Некоторые вещи делать на C# гораздо удобнее,чем на C++. Поэтому если нужно написать какую-то тулзу или редактор, то я обычно использую именно C#. Сегодня у нас с коллегами возник вопрос, возможно ли использовать .NET для написания плагинов для не .NET приложений. Для этого обеспечить экспорт соответствующего набора функций. Мне удалось это обеспечить с помощью использования С++\CLI. Экспортируемые функции помещаются в unmanaged область с помощью #pragma unmanaged. А уже из них можно вызывать managed код. Я сделал следующим образом.


#include <windows.h>
using namespace System;
//Мэнеджед функция, из которой
//можно использовать все возможности .NET
void test(const char* data, int size)
{
//String может быть создан
System::String ^str = gcnew System::String(data);
Console::WriteLine(str);
}

//Немэнеджед часть, которая вызывается
// пользователем dll'ки.
#pragma unmanaged
void test1(const char* data, int size)
{
//А здесь из мэнеджед части вызывается немэнеджед код
test(data, size);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL,
DWORD fdwReason, LPVOID lpvReserved)
{
return TRUE;
}



Я не исползьвовал собственно C#, но ничто не мешает в мэнеджед части использовать классы, написаные с помощью этого языка.

среда, 24 октября 2007 г.

LCC в топку!

Решил я отказаться от использования LCC в школе. Слишком уж у него глючная среда. Часто неправильно срабатывает отмена изменений или файлы проекта просто не попадают в список компиляции. Я-то конечно могу справиться с этими проблемами, но я один, а учеников много. Поэтому я решил перейти на Code::Blocks. Эта среда разработки показалось мне достаточно адекватной.

Олимпиада по программированию

Напрягли меня провести школьную олимпиаду по программированию. Взять из каждого(из 4х) класса по 3-4 человека и дать им задание. Победителей предполагается отправить на районную олимпиаду. Хотя мне эта идея кажется несколько сомнительной - жестоко отправлять кого-то на олимпиаду только после нескольких месяцев изучения предмета.

понедельник, 15 октября 2007 г.

Маленькие платформы

Я недавно пришёл к выводу, что мне больше нравится программировать под всякие ограниченные слабосильные платформы, чем под PC. В этом есть нравящееся сочетание вызова и ощущение того, что всё как на ладони.
Собственно уже почти два года(с некоторыми перерывами) я этим и занимаюсь. Всё началось для меня с платформы PowerTV. Это абонентская часть сети интерактивного цифрового телевидения(Set-top-box). От обычного цифрового декодера этот девайс отличается способностью загружать софт по тому же каналу, что и видео, и запускать его. И наличием канала обратной связи с источником этого канала. 32 мегабайта памяти и 164 мегагерца MicroSPARC процессора. Вот для таких устройств я и начал писать игры летом 2005 года.

среда, 10 октября 2007 г.

Ещё о Linux'е.

Для меня линукс никогда не был реальной средой для использования компьютера. Впервые я поставил себе ликус, ещё когда учился в универе(году в 2002-2003). Это был Mandrake 8.2(а потом 9). Всё чего я хотел, это посмотреть что вообще возможно под ним делать. А это включало в себя игры, программирование, прослушивание музыки, просмотр фльмов и фотографий, и браузинг в интернете. Работа с документами и почтой в тот момент меня практически не интересовала. Всё вышеперечисленное уже тогда было вполне возможно.

Часть игр вполне можно было запускать с помощью Wine. Max Payne у меня заработал практически так же как и под Windows. Правда Unreal Tournament нормально работать не захотел - были проблемы с захватом мышки и полноэкранным режимом.

Музыку я слушал с помощью XMMP. Он во многом похож на Winamp. Геморрой был правда с тэгами. Все теги в моей коллекции mp3-файлов были в виндовой кодировке. XMMS же хотел KOI8-R. Это удалось побороть установкой cp1251-шрифтов.

Для программинга я использовал KDevelop. Но особо глубоко я в этом направлении не копал. Просто попробовал скомпилить несколько простеньких консольных приложений.

С остальным проблем вобще не возникло. Уже тогда была Opera для Linux, практически неотличимая от Windows версии. Для просмотра видео я использовал MPlayer.

Недавно я попробовал поставить себе дома Ubuntu. Играть не пробовал. Почтовик поставил тот же, что и не работе - Thunderbird. Браузер - Опера. Очень огорчился, когда понял, что миранды для линукса нет =(. В XMMS опять возникли проблемы с кодировками тэгов, но на этот раз побороть проблему не вышло.

Linux в школах

И ещё по поводу преподавания в школе.
Вот последнее время достаточно часто приходится слышать по поводу использования Linux в школе. В принципе, если бы на школьных компах стоял Linux, то для меня(да и для учеников) никакой проблемы бы это не составило. Реально необходимы только компилятор(там есть GCC) и простая вменяемая среда разработки с удобным дебагером.
И полученные таким образом знания потом без проблем можно использовать и для программирования под Windows.

Кстати, насколько мне известно, в одной из Калининградских школ Linux уже внедряли. Не знаю правда насколько успешно это было сделано.

вторник, 9 октября 2007 г.

Преподавание

Кстати я упомянул о том, читаю школьникам курс программирования.
В принципе у меня была полная свобода в выборе языка, который я буду рассказывать. После недолгих размышлений я выбрал C. На выбор повлияло два файтора. Во-первых у него привычный для меня синтаксис, а во-вторых я и сам учился программировать именно на этом языке(если не считать первых попыток на спектрумовском бэйсике).
Дальше осталось только выбрать компилятор и IDE к нему. Вначале я остановился на lcc в силу его легковесности и бесплатности. Кроме него существуют и другие бесплатные компиляторы(а это основное условие) вплоть до Microsoft Visual Studio 2005 Express Edition. Но ставить в школу этого монстра мне совершенно не хотелось и я просто взял lcc, который уже видел раньше. Правда потом я попробовал ещё DevCpp Code::Blocks с MinGW компилятором. Из них Code::Blocks понравился мне гораздо больше.

Вообще при случае нужно будет ещё попробовать Borland'овский Turbo C++ Explorer. У него тоже есть бесплатная версия. Правда кроме этого у него есть и очевидный недостаток - большой размер дистрибутива в 390 мегов.

Консольная кодировка

Был тут давеча весьма шокирован. Совершенно неожиданно для меня оказалось, что под виндой текст в консоль выводится в досовской кодировке. Больше всего меня удивляет, как я мог не замечать этого раньше. Ведь уже далеко не первый год программированием занимаюсь. А обнаружил это только когда начал школьникам преподавать курс программирования на C. Похоже, что раньше я просто ничего не пытался выводить в консоль кириллицей. Причём с MSVC всё легко решается с помощью
setlocale(LC_CTYPE, ".1251");
то при использовании LCC-Win32 или MINGW это почему-то не помагает. Так пока и не удалось забороть проблему. Буду дальше бороться.
Кстати, я сразу же решил попробовать вывести строчку кириллицей с помощью C#. Там никаких проблем не возникло. Слава Юникоду! =)

Использование инлайнов.

Сегодня возникла с коллегой дискуссия по поводу использования inline-функций членов классов. Он старается пихать инлайны практически везде, где возможно. Есть даже виртуальные инлайн-функции. Тем не менее в современных версиях Microsoft Visual Studio( начиная с 2003) это ключевое слово фактически потеряло актуальность, ибо оптимизатор сам решает, делать ли функцию inline или же нет. Я склоняюсь к тому, что во многих случаях попытка сделать функцию инлайновой является преждевременной оптимизацией.