Разработка программы на языке C/С++, страница 2

C - гибкий язык, позволяющий принимать в конкретных  ситуациях самые разные решения. Тем не менее, C налагает незначительные ограничения в таких, например, действиях, как преобразование типов. Во многих случаях это является достоинством, однако  программисты  должны хорошо знать язык, чтобы понимать, как будут выполняться их программы.1 Постановка задачи и алгоритм решения

Требуется разрабоать редактор расписаний пассажирских поездов с графическим интерфейсом, использующим средства библиотеки Qt.

Особенности программы:

При написании программы значительное внимание было уделено минимизации требований к ресурсам системы. Разработанный формат файла расписаний позволяет отводить на хранение записи всего лишь 9 байт, это досигается хранением информации о станциях в отдельном теством файле, который можно редактировать с помощью любого текстового редактора, т.е. в самих файлах расписаний не храняться строки, описывающие названия станций, т.к. это нерационально – пришлось бы резервировать для каждого элемента переменную максимально возможного размера.

Для переноса названий станций из файлов расписаний в отдельный файл в файлах расписаний используется стандартный семизначный код системы “Экспресс-2”, который позволяет однозначно идентифицировать станцию.

Кроме того, программа поддерживает интернационализацию (i18n), значительная часть поддержки которой реализована средствами Qt, но также можно добиться перевода (или транслитерации) на другой язык названий станций редактированием файла списка станций. При этом не требуется редактирование самих файлов расписаний. В базовом варианте программы доступен русскоязычный и англоязычный интерфейс.

Редактор разрабатывался в OS RedHat Linux 9.0, но теоретически он должен быть переносимым в другие операционные системы

Программа разрабатывалась при помощи следующих средств: Qt Designer 3.1, gmake1.04a, GNU Make 3.79.1, перевод Qt Linguist 3.1.1, lupdate 3.1.1, lrelease 3.1.1.

Для компиляции программы необходимо перейти в каталог программы и создать Makefile командой qmake -o Makefile trainsys.pro, затем откомпилировать проект командой make, исполняемый файл будет иметь имя trainsys.2 Используемые возможности языка C и компилятора gcc.

В программе используются следующие стандартные возможности языков С/С++:

•структуры;

•задание длин полей структур в битах;

•указатели;

•динамическая память;

•классы и объекты;

•циклы;

•операторы циклов, ветвления и выбора.

Кроме того из-за необходимости минимизации потребления ресурсов системы я был вынужден использовать одно из нестандартных GNU-расширений компилятора gcc – задание атрибутов переменных.

Дело в том, что по умолчанию для ускорения доступа к переменным, каждая из них выравнивается в памяти на величину 32-х битного слова. Т.е., если переменная содержит 1 байт данных – для неё всё равно выделяется 4 байта, а “лишние” 3 байта никак не используются, только занимают память. А при сохранении в файл “лишние” байты занимают дисковое пространство, сводя на нет все преимущества экономного формата файла. Для решения этой проблемы используется задание атрибута packed для каждого поля структуры. Как говориться в документации компилятора gcc, “Атрибут packed указывает, что переменная или поле структуры должны иметь наименьшее возможное выравнивание – один байт для переменной и один бит для поля структуры, если только вы не указали большее значение при помощи атрибута aligned”.3 Список используемой литературы

1 Qt Reference Documentation

2 gcc info page

3 gcc man page

4 Б. И. Березин, С.Б. Березин Начальный курс C и C++, Диалог-МИФИ, Москва, 1999Заключение

При разработке программы серьёзную помеху составляло отсутствие встроенной в язык C поддержки динамического задания размеров массивов, поэтому для минимизации использования памяти массив состоит не из самих записей, а из указателей на записи.

Также весомым ограничением языка C/C++ является отсутствие поддержки многобайтных символов (Unicode).

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