четверг, 29 ноября 2007 г.

Компилятор ANSI C'99

smorgasbordet - Pelles C

Мой опыт "общения" с компилятором сугубо положительный. Судите сами: я смог воспользоваться lib файлами предназначенными для VC 6.0 для IUP, SDL, Lua что избавило меня от необходимости компилировать из исходников библиотеки.

Ещё один LLC-based ANSI C99 компилятор, который выгодно отличается от своего брата LCC-W32 удобной лицензией (компилятор полностью бесплатен).

В состав входят:
- Удобная функциональная IDE (foldings, настройка подсветки синтаксиса, внешние утилиты, внешние help файлы, плагины).
- Редактор ресурсов, битмапов, курсоров, иконок и т.д.
- Отличная лаконичная справочная система. Привыкаешь к ней быстро + она интегрируется с IDE
- Совместимость в VC++
- Hex редактор
- Интегрированый source-level отладчик
- Интегрированный ассемблер с Intel синтаксисом с возможностью использовать вместо него MASM bkb FASM
- Поддержка SEh конструкций __try, __except, __finally, __leave
- Поддержка отложеной загрузки DLL (delayed loading of DLL's, much like Microsoft)
- Поддержка PocketPC!
- и многое другое...

Скачать можно с официального сайта.

В состав, кроме стандартной библиотеки С99 входят дополнительные posix библиотеки. В целом, поставку назвать бедной никак не получиться, хотя она слабее чем в компиляторе LCC-W32.

Несколько скриншотов с официального сайта компилятора:

Предчувствие не подвело - новый IUP 2.6

В поисках новых ресурсов по программированию с использованием IUP решил почитать что нового на luaforge.net. Было предчувствие, что что-то новое обнаружится, и оно не подвело. Именно сегодня IUP 2.6 RC2 перешёл в стадию релиза.
Параллельно зарелизился IM 3.3.
Вот что написано на luaforge:

The 2.6 final version of the IUP toolkit has been released.
IUP is a portable toolkit for building graphical user interfaces.
You can find the list of changes and files for download at:
http://www.tecgraf.puc-rio.br/iup/
The IupLua binding for Lua 5.1 is available.
Best Regards,
Antonio Scuri
Поздравляю всех будущих\текущих пользователей!

среда, 28 ноября 2007 г.

Удобный метод создания статических контролов в IUP

Очень приятный метод написания кода функций создания статических контролов в IUP.

Допустим, необходимо сметь функцию создания контрола вертикальной группировки (vbox), который внутри себя содержит три контрола горизонтальной группировки (hbox). Так же, есть необходимость безопасно получать handle vbox'a.
Для решения этих 2х задач, очень удобно использовать одну функцию, которая либо возвращает handle уже созданного vbox'a, либо создаёт его и возвращает его handle.

Код может иметь вид:

// макроопределения хендла
#define GUI_VBOX "vbox"

// vbox
Ihandle *gui_GetVbox( void )
{
Ihandle *vbox = NULL;

// Существует ли vbox ?
vbox = IupGetHandle( GUI_VBOX );
if ( !vbox )
{
// vbox не существует и его необходимо создать
fprintf( stdout, "Создание vbox..." );

// Получаем хендлы детей vbox'a

// все функции аналогичны gui_GetVbox()
Ihandle *upperHbox = gui_GetUpperhbox();
Ihandle *middleHbox = gui_GetMiddlehbox();
Ihandle *lowerHbox = gui_GetLowerhbox();

// Создаём новый vbox
vbox = IupVbox( upperHbox, middleHbox, lowerHbox, NULL );
if ( !vbox )
{
fprintf( stderr, "vbox не был создан" );
return NULL;
}
// присваиваем хендл vbox'у
IupSetHandle( GUI_VBOX, vbox );

fprintf( stdout, "... vbox был создан" );

// установка атрибутов элемента vbox
IupSetAttribute( vbox, IUP_ALIGNMENT, IUP_ACENTER );
}
return vbox;
} // gui_GetVbox

При таком подходе, для создания диалога, достаточно вызвать всего 1 функцию, скажем,
gui_GetVbox() , который может быть родителем для нашего vbox и автоматически будут созданы все контролы "сверху-вниз".

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

ToDoList

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






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

Правда, некоторые пользователи отмечают неторопливость отрисовки списка, когда он содержит уже 200-300 элементов.

среда, 21 ноября 2007 г.

Новая группа

Создана новая группа рассылки, которая будет получать уведомления о новых сообщениях в блоге.

Что бывает, когда не знаешь различия между С и С++

А действительно, что бывает? Например, случается глупость писать статьи, которые публикуются на серьёзных сайтах и при этом по-содержанию глупые. Так и было с неизвестным автором известной статьи "ООП и язык С", опубликованной на www.ishodniki.ru. Читая заголовок, можно представить, что в статье будет рассмотрен ещё один вариант чисто академической задачи эмуляции ООП в pure С... Ан, нет. Автор пытается переписать С++ код на С++, но через жопу ;) При этом, в конце статьи он ещё и доволен результатом ;)) Да, и такое бывает, когда не знаешь о чём пишешь...

Статья "C или C++?"

Недавно прочитал статью на ishodniki.ru. Очень нейтральная статья, я со многими тезисами согласен. В целом, девиз статьи можно выразить как "Будте осторожны при использовании С++". В любом случае, считаю что напоминание не лишнее.

Есть даже программисты, которые советуют перечитывать книги вроде "Практика программирования" Роба Пайка ("The practice of programming" Rob Pike) раз в пару месяцев лишь для того, чтобы вспомнить прописные истины. Ещё раз подстегнуть себя. От себя хочу добавить, что полезный совет, если времени не жалко ;)

Пример iupdialog2.c

Рассмтрим стандартный пример из поставки IUP. Он довольно выразительный и раскрывает концепции функций обратного вызова, системы атрибутов. Ключевые строки будут мной прокомментированы (комментарии в стиле С99).

// Подключение единственного заголовочного файла
#include "iup.h"

// это наш callback
int quit_cb(void)
{
return IUP_CLOSE;
}

int main(void)
{
// объявим хендлы для диалогов
Ihandle *dialog, *quit_bt, *vbox;

// Инициализируем библиотеку. Вобще, автору стоило бы проверять код
// ошибки.
// Кстати, библиотека может быть непроинициализированна только в Linux.
// В остальных OS она всегда успешно инициализируется.
IupOpen();

// Получаем хендл созданной кнопки с текстом "Quit". Второй параметр функции
//
оставлен только для совместимости со старым методом регистрации CALLBACK
// и сейчас его лучше не использовать, передавая NULL.
// Автору лучше проверить не вернула ли IupButton() значение NULL?
// После создания кнопки, она не сразу отображается, ведь у неё ещё нет родителя.
quit_bt = IupButton("Quit", 0);

// Новый метод регистрации callback funciton.
// Указываем, что для элемента quit_bt будет зарегистрирована коллбэк функция
// quit_cb. Параметры функций обратного вызова могут быть различными, но всегда
// они должны приводится к типу Icallback, который является указателем на функцию.
// Второй параметр "ACTION" - это имя действия, после совершения которого будет
// вызвана наша функция обратного вызова
IupSetCallback(quit_bt, "ACTION", (Icallback)quit_cb);

/* the container with a label and the button */
// Создаём контейнер (вертикальная группировка) с контролом "метка" и
// 1 кнопкой.
vbox = IupVbox(
IupSetAttributes(IupLabel("Very Long Text Label"), "EXPAND=YES,
ALIGNMENT=ACENTER"),
quit_bt,
0);
// Указываем атрибуты для элемента вертикальной группировки
IupSetAttribute(vbox, "ALIGNMENT", "ACENTER");
IupSetAttribute(vbox, "MARGIN", "10x10");
IupSetAttribute(vbox, "GAP", "5");

// Получаем хендл только что созданного диалга, который принимает в качестве
// ребёнка элемент группировки vbox. Т.о. диалог становится родителем для vbox.
dialog = IupDialog(vbox);
// Устанавливаем атрибут титула диалога как "Dialog Title"
IupSetAttribute(dialog, "TITLE", "Dialog Title");

// Отрисовываем немодальный диалог со всеми контролами
IupShow(dialog);

// Запуск цикла обработки сообщений. Выход из него будет произведён, если не будет
// ни одного диалога, либо кто-то из обработчиков вернёт IUP_CLOSE.
IupMainLoop();

// Уничтожить вручную диалог. Все дети диалога уничтожатся автоматически
IupDestroy(dialog);
// Деинициализация библиотеки и освобождение ресурсов
IupClose();

return 0;
}


Вот так всё просто оказалось. Единственное, на что может обратить внимание внимательный читатель -- это порядок создания диалога и размещения в нём элементов. Он не такой, как в большинстве библиотек для построения GUI.
Общий алгоритм действий для создания диалога выглядит так:
  1. Создать контролы.
  2. Создать элементы группировки (IupHbox, IupVbox, IupZbox, IupFill), которые в качестве параметров принимают уже проинициализированные хендлы контролов.
  3. Создать диалог, который принимает в качестве родителя самый "верхний" в иерархии элемент группировки или контрол.

Библиотеки IM и CD

Кроме графической библиотеки IUP есть ещё 2 библиотеки от того же производителя облегчающие написание кроссплатформенных GUI.
Итак, это CD (canvas draw) - графическая кроссплатформенная библиотека, которая тесно интегрируется с IUP. Многие из примеров для библиотеки IUP требуют для компиляции либу CD, так что её лучше сразу скачивать, вместе с iuplib.

Описание на luaforge гласит:
CD (Canvas Draw) is a platform-independent graphic library. It uses native graphic libraries: Microsoft Windows (GDI) and X-Windows (XLIB). It supports both vector and image primitives. The canvas is an abstract surface that can be also a Metafile.

Библиотека IM (image manipulation) - библиотека для работы с изображениями. Она является отличным дополнением для приложений, которым нужен расширенный вывод изображений в графических приложениях или просто манипуляции с изображениями. Из описания на luaforge следует, что мы имеем дело с:
IM is a toolkit for Digital Imaging. IM is based on 4 concepts: Image Representation, Storage, Processing and Capture. The main goal of the library is to provide a simple API and abstraction of images for scientific applications.

Библиотеки IM и CD отлично интегрируются с IUP и являются отличным дополнением к ней. Разобраться с ними не составит никакого труда, ведь их дизайн очень похож на IUP.

Приятного дня! ;)

четверг, 15 ноября 2007 г.

Скриншоты использования библиотеки IUP

Некоторые из скриншотов программ, при использовании библиотеки IUP. Взяты с оффициального сайта.

среда, 14 ноября 2007 г.

Стоит рассказать о замечательной кроссплатформенной библиотеки для построения графического интерфейса программы IUP. Эта библиотека разработана в Pontifical Catholic University of Rio de Janeiro в Бразилии. Как и много других продуктов разработчиков из этого университета она написана на С и может работать в системах:

  • UNIX (SunOS, IRIX, and AIX) using Motif 2.x
  • UNIX (FreeBSD and Linux) using GTK+
  • Microsoft Windows 2000/XP/2003 using Win32
Библиотека использует концепции событий, системы атрибутов и функций обратного вызова (callback functions), систему слоёв. Самое главное отличие от других библиотек виджетов является система атрибутов, на которой построено всё взаимодействие с графическими элементами.
Именно развитая система атрибутов позволяет иметь совсем небольшое количество функций, что делает библиотеку небольшой. Это отлично вписывается в идеологию разработчков:
  • Предпочитать множество маленьких библиотек, вместо одной большой.
  • Использовать для каждой платформы "родные" графические компоненты.
  • Позиционировать элементы не используя точные координаты, используя механизм привязок и слоёв. Что делает интерфейс менее зависимым от разрешения пользователя.
  • Возможность использовать эту графическую библиотеку совместно с другими
Библиотека отлично подходит для написания небольших утилит и промышленных приложений. Это обусловлено в первую очередь небольшим количеством стандартных виджетов (к слову, там есть все стандартные виджеты Win32). Но библиотека свободно расширяется и есть специальное API (в IUP оно называется CPI) для добавления новых виджетов.
Для изучения возможностей библиотеки не требуется много времени, что делает её привлекательно для программистов, которые сразу хотят приступить к написанию кода, не штудируя огромное количество мануалов. На английском языке доступен мануал по адресу http://www.tecgraf.puc-rio.br/iup/, где описание концепций библиотеки чередуется с полным описанием функций, эти концепции реализующих. Мануал достаточно полный и удобный, но в нём присутствуют некоторые неточности в параметрах функций. Однако, это лечится простой сверкой параметров функций с определениями в главном заголовочном файле iup.h.

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

Исходные тексты библиотеки, документация на английском, скомпилированные для разных платформ библиотеки лежат по этому адресу.

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

Приветствую Вас в блоге, который посвящён программированию на языке С. Да-да, именно на С, а не на С++ или С# ;)
Причин этому на самом деле много, но они не публикуются, дабы не развязывать очередной HolyWar на страницах блога. Ведь те приёмы программирования, которые хорошо подходят для С могут быть совершенно неэффективны для С++ и наоборот.

Итак, с направленностью определились, пора в путь...