close

Вход

Забыли?

вход по аккаунту

?

FreeBASIC19

код для вставкиСкачать
Пособие для начинающих программировать на языке высокого уровня FreeBASIC. Работа состоит из нескольких глав. В главе 19 "Виртуальная машина инженера" – продолжение пособия, которое будет интересно для учащихся школ, студентов институтов, а также пр
1
Евгений Рыжов, инженер
Программирование на языке FreeBASIC
пособие для начинающих
Пособие для начинающих программировать на языке высокого уровня FreeBASIC.
Работа состоит из нескольких глав. В главе 19 "Виртуальная машина инженера" –
продолжение пособия, которое будет интересно для учащихся школ, студентов
институтов, а также преподавателей.
Фрагмент 19. "Виртуальная машина инженера"
Совсем недавно я вел очень активную жизнь:
играл в теннис, футбол, занимался шахматами и стрельбой,
участвовал в автогонках, соблазнял красивых девушек...
Но все это закончилось...
когда сгорела материнская плата на моем компьютере...
Откровение молодого программиста.
2
1. Вместо введения.
Знаменитая русская матрёшка хорошо известна далеко за пределами России.
Матрёшкой
называют
набор традиционных русских деревянных кукол
уменьшающегося размера, помещенных внутрь друг друга. Матрёшку можно открыть,
чтобы достать изнутри меньшую матрёшку, у которой, в свою очередь, внутри также
есть матрёшка и так далее. Мировую популярность русской матрёшки подтвердила и
проходившая в Санкт-Петербурге в 2013 году крупнейшая Международная
студенческая олимпиада по программированию ACM-ICPC ICPC, проводимая
ежегодно Association for Computing Machinery (ACM) под названием International
Collegiate Programming Contest (ICPC). В качестве одной из конкурсных задач на
Олимпиаде была предложена "Задача H: Матрёшка", смысл которой в следующем: в
Национальном Матрёшечном музее недавно проходила выставка матрёшек, на которой
были представлены похожие по стилю, но отличающиеся количеством матрёшек в
наборе куклы. К сожалению, один шаловливый ребенок разобрал все матрёшки на
стенде и выставил все куклы в ряд. В ряду оказалось N матрешек (1<=N<=500), для
каждой известен ее размер (целое число). Предлагается заново собрать все матрешки в
наборы, при условии, что не известно ни изначальное количество наборов, ни
количество кукол в каждом из наборов. Известно только то, что каждый набор состоит
из кукол всех последовательных размеров от 1 до некоторого M, причем M может быть
различным для различных наборов. Требуется написать программу, которая вычислит
минимальное количество открытий, необходимых для сборки всех наборов матрешек.
Разбор задач финала чемпионата ACM-ICPC-2013 приведен на сайте:
http://www.pvsm.ru/algoritmy/38567
Матрёшка (от уменьшительного имени "Матрёна") имеет более чем столетнюю
историю. За этот сравнительно небольшой исторический период матрешка стала одним
из всеобъемлющих образов России, символом русского народного искусства. В
настоящее время существует несколько центров по изготовлению и росписи матрешек.
Это подмосковный Сергиев Посад, нижегородские центры в городе Семенове, в селах
Полховский Майдан и Крутец. Известны вятские, тверские, марийские, мордовские
расписные матрешки. Первая русская матрешка, выточенная по эскизам Сергея
Васильевича Малютина (1859—1937) лучшим матрешечником из Сергиева Посада
Василием Петровичем Звёздочкиным (1876—1956), была "восьмиместная". За девочкой
с черным петухом (самая большая кукла) следовал мальчик, затем опять девочка. Все
матрешки отличались друг от друга, а последняя, восьмая, изображала спеленованного
младенца.
В 1900 году матрешку отвезли на Всемирную выставку в Париж (выставка
продолжалась с 15 апреля по 12 ноября 1900 года), где ее высоко оценили специалисты.
Идея создания разъемной деревянной матрешки была подсказана Малютину японской
игрушкой, привезенной с острова Хонсю Елизаветой Григорьевной Сапожниковой
(1847—1908), женой Саввы Ивановича Мамонтова (1841—1918). Это была фигура
добродушного лысого старика, мудреца Фукуруму, в которой находилось еще
несколько фигурок, вложенных одна в другую. Японцы, кстати, утверждают, что
первым выточил подобную матрешку на острове Хонсю русский монах.
3
Справка: Василий Петрович Звёздочкин (1876 —
1956) — русский умелец, создатель первой
матрёшки. Родился в 1876 году в деревне Шубино
Подольского уезда, в семье крестьянина. Окончил
церковно-приходскую школу и в 22 года ушел на
заработки в Москву. Работал в мастерской "Детское
воспитание", принадлежащей купцам Мамонтовым
(Леонтьевский переулок, дом 7). После расширения
производства, Звёздочкин перебирается в Сергиев
Посад. В 1914 году Василия Петровича, как
опытного мастера, перевели преподавателем в
токарный цех школы по игрушечному промыслу.
Механизм инкапсуляции (от лат. in - в, capsula – коробочка) или по-русски –
"сокрытие вложением" применяется для многих объектов совершенно различной
природы. После удаления (физического или логического) видимой оболочки
открывается некоторый "черный ящик" про уровни вложенности которого ничего не
известно... Потому для общей идеи этой брошюры и была выбрана модель матрешки...
Однако полученные от читателей письма, заставили несколько
скорректировать содержание выпуска (не меняя матрёшечную модель)... Но вот что
показалось забавным: после озвученного Государственной думой призыва "покончить с
напускной анонимностью в интернете", авторы писем просят не называть их имена
(псевдонимы) в брошюрах. В связи с этим раздел письма \ почта решил не
публиковать...
4
2. Традиционная "художественная галерея".
В начале декабря 2011 года на "русских торгах" в Лондоне были установлены
новые ценовые рекорды. Одна из самых дорогостоящих работ художников России
по результатам аукционных продаж – картина Василия Дмитриевича Поленова (1844—
1927) "Кто из вас без греха?" (1908, холст, масло, 118 x 239) была оценена в
4,07 млн.фунтов.
Свой долг художника Поленов видел в концентрации сил для создания
евангельского цикла картин "Из жизни Христа" (1899-1909), который он мыслил
себе "рядом картин и сцен, связанных между собой эстетической атмосферой". Первой
работой этого цикла оказалась картина "Христос и грешница". Сюжетом этого полотна
послужила легенда о Христе и грешнице, описанная в Евангелии от Иоанна, в главе
VIII. Там говорится: "Иисус же пошел на гору Елеонскую. А утром опять пришел в
храм, и весь народ шел к нему. Он сел и учил их. Тут книжники и фарисеи привели к
нему женщину, взятую в прелюбодеянии, и, поставивши ее посреди, сказали Ему:
Учитель! эта женщина взята в прелюбодеянии; а Моисей в законе заповедовал нам
побивать таких камнями! Ты что скажешь? Говорили же это, искушая Его, чтобы найти
что-нибудь к обвинению Его. Но Иисус, наклонившись низко, писал перстом на земле,
не обращая на них внимания. Когда же продолжали спрашивать Его, Он
восклонившись сказал им: кто из вас без греха, первый брось в нее камень. И опять,
наклонившись низко, писал на земле. Они же, услышавши то и будучи обличаемы
совестью, стали уходить один за другим, начиная от старших до последних; и остался
один Иисус и женщина, стоящая посреди. Иисус, восклонившись и не видя никого
кроме женщины, сказал ей: женщина! где твои обвинители? никто не осудил тебя? Она
отвечала: никто, Господи! Иисус сказал ей: и Я не осуждаю тебя; иди и впредь не
греши".
Василий Поленов "Кто из вас без греха?"
5
Картина была впервые показана на XV-ой выставке передвижников 24 февраля
1887 года, но сенсацией стала еще до дня открытия. Правда авторское название "Кто из
вас без греха?" было заменено цензурой на "Христос и грешница". Приобрести эту
картину мечтал Павел Михайлович Третьяков (1832—1898). Торгуясь о цене, он
предложил художнику объявить всем, что картина уже продана. И, если на выставке
она понравится Александру III, то Поленов получит солидную сумму, в противном же
случае цена будет меньше. В конце февраля Василий Дмитриевич записал: "Сегодня на
выставке был государь. Он был необыкновенно мил и деликатен. Увидев меня,
обрадовался, подал руку, спросил, отчего я совсем не бываю в Петербурге. Подойдя к
моей картине, сказал: "Интересно, но жаль, что картина плохо освещена". Потом
подошла государыня и заметила, что выражение лица у Христа – превосходно.
"Правда, правда, — сказал государь — издали он мне показался немного стар, но
выражение лица чудесно. Поленов, а ваша картина свободна?" "Никому не
принадлежит, Ваше императорское величество". "В таком случае, я оставляю ее за
собой"... Картину не просто "приняли". Это был триумф. Картина была куплена
Александром III для своей коллекции.
Оконченный в 1909 году библейский цикл из примерно 60 картин
экспонировался в Москве, Петербурге, Праге и других городах. Успех был
грандиозный. Появился альбом с фототипиями картин, высоко оцененный
Л.Н.Толстым: "Альбом ваш произвел на меня сильное впечатление. Воображаю, как
подействовала бы сама выставка". А далее история картин Василия Поленова из
библейского цикла обрастает детективными сюжетами...
Авторское повторение знаменитой картины из Русского музея про Христа и
грешницу чуть было не погибло из-за айсберга. Его собирались увести в Штаты на
"Титанике" (во время первого рейса 14 апреля 1912 года столкнулся с айсбергом и
затонул в 2 часа 20 минут ночи следующих суток). Но обошлось... В 1924 году
двенадцать картин евангельской серии по инициативе советского правительства
отправляются в заморский вояж, на Нью-Йоркскую выставку русского искусства, и
становятся ее "гвоздем". Поленов оказался не только самым покупаемым, но и самым
"дорогим" художников: из 12 работ были проданы 9 на общую сумму 21 тысяча 400
долларов. Правда, на руки автор получил только 6 тысяч, а непроданные вещи по
возвращении и вовсе бесследно исчезли. С тех пор часть библейского наследия
Поленова считалась навсегда утраченной для отечественной культуры. На момент
открытия в ГТГ в 1994 году масштабной выставки к 150-летию мастера о них со слов
внука художника, Федора Дмитриевича Поленова, было известно только то, что они в
Америке. Американский филантроп подарил ее и вторую работу христова цикла,
"Повинен смерти", одному университету, который в полной безвестности хранил их
почти 80 лет. А в XXI веке, с удивлением глядя на рост цен на русские вещи, извлек
из хранилищ и отдал на продажу.
6
3. Дополнения по письмам читателей.
Эта глава представляет собой эклектику из того, о чем хотел написать в
брошюре, но со щедрым добавлением того, о чем просили читатели в своих письмах.
3.1. Виртуальная машина инженера.
По-сути этот пункт является сильно ужатым началом брошюры, повествующей
по задумке автора о системах обработки данных (DPS, data processing system). Ведь в
своей повседневной деятельности "инженер" (от фр. ingenieur – изобретатель)
достаточно часто сталкивается с необходимостью воспользоваться услугами некоторой
"системы обработки данных", архитектура которой в большой степени связана с
классом решаемых задач. Но практически всегда это аппаратно-программный
комплекс, способный, по мнению "инженера", наилучшим образом реализовать его
"творческие фантазии". Это своего рода "дружелюбный исполнитель некоторых
алгоритмов", состоящий, соответственно, из двух основных частей:
аппаратная часть (Hardware) — устройство сбора и/или обработки
информации;
программная часть (Software) — специализированное ПО, обрабатывающее
данные.
Практически во всех брошюрах используется термин "алгоритм". Не будет
исключением и настоящий фрагмент. Алгоритм — точное и полное описание (набор
инструкций) процесса выполнения некоторой работы (деятельности), которое
позволяет другим людям или машинам (исполнителям) повторять эту деятельность
абсолютно точно, без малейших отклонений, и получать нужный результат за конечное
число действий. Обычно сначала (на уровне идеи) алгоритм описывается словами, но,
по мере приближения к моменту передачи его исполнителю, он обретает всё более
формальные очертания с использованием формулировок на языке, безоговорочно
понятном исполнителю, например, на языке FreeBASIC при реализации алгоритма на
цифровой вычислительной машине. Хотя в определении алгоритма требуется лишь
конечность числа шагов, требуемых для достижения результата, на практике на
выполнение вводятся дополнительные ограничения, например, на предполагаемую
сложность алгоритма (временную, вычислительную и др.). Для успешного
превращения некоторой идеи в исполняемую программу, разрабатываются
специальные информационные технологии (Information Technology), т.е. совокупность
методов и средств позволяющих снизить трудоемкость процессов и повысить их
надежность и оперативность. Для каждой задачи может существовать множество
алгоритмов, приводящих к цели. Поиск наиболее эффективных алгоритмов составляет
основную задачу информационных технологий.
Большинство людей, пользователей компьютеров, даже не подозревает, что
происходит во время работы на компьютере. По словам Адриана Вонга [01] им
кажется, что компьютер всего на всего примитивно реагирует на нажатия клавиш и
щелчки мышью. Компьютер делает то, что ему приказывают - он не задает вопросов.
На самом деле, все не так просто. Чтобы выполнить команду, аппаратнопрограммный комплекс решает множество задач, но действия его скрыты механизмом
инкапсуляции, за дружественным графическим пользовательским интерфейсом (GUI,
Graphical user interface). Кроме графического интерфейса с пользователем необходимо
7
рассмотреть еще один, более важный для нас сегодня, интерфейс с прикладными
программами (API, Application programming interface). К сожалению, стало уже
хорошим тоном при описании систем программирования уделять основное внимание
первому интерфейсу - "игровому" в ущерб второму - "вычислительному". Это один из
факторов, который делает фигуру инженера-программиста более привлекательной, по
отношению к фигуре инженера-металлурга. Но вот что заметил за многие годы работы
в пусконаладочной организации: из инженера-металлурга легче сделать инженерапрограммиста, нежели наоборот - из инженера-программиста воспитать инженераметаллурга.
"Металлург" и "Программист" – они оба инженеры.
Попробовал поискать разгадку этого феномена в литературе... Пожалуй, ближе
всех подошел к этой проблеме Виктор Эмиль Франкл (1905 — 1997) — австрийский
психиатр, психолог и невролог [02]. Говоря о смысле труда, он отметил следующее:
"Пока созидательные ценности находятся на переднем плане жизненной задачи
человека, он их, как правило, реализует в процессе своей работы. Обычно работа
представляет собой ту область, где индивидуальность личности человека
проявляется по отношению к обществу и, таким образом, приобретает смысл и
ценность. Однако эти смысл и ценность зависят от того, какой вклад в общество вносит
работа, выполняемая человеком, а не от собственного положения, занимаемого им в
обществе. Поэтому нельзя сказать, что именно эта или та должность предоставляет
человеку возможность выполнения своей жизненной задачи. В этом смысле профессия
сама по себе не является единственным путем к самовыражению. Действительно,
многие, особенно склонные к невротическим реакциям, люди утверждают, что могли
бы выполнить свою жизненную миссию, если бы выбрали себе другую профессию. Но
8
подобное заявление есть следствие либо неверного понимания роли, которую играет в
жизни человека выбранная им специальность, либо самообмана. Если и существуют
случаи, когда выбранная работа не приносит человеку удовлетворения, то виноват сам
человек, а не работа. Работа сама по себе не делает человека нужным и незаменимым;
она лишь предоставляет ему возможность стать таковым".
Интерфейс (interface = inter - между + face – лицо) — сопряжение, совокупность
способов и методов взаимодействия двух устройств, систем или программ (для обмена
информацией между ними). Простейший пример - разъемное соединение
электрических проводников (розетка и вилка) для обеспечения связи между
источником электрического тока и его приемником. Конечно, для работоспособности
кроме совпадения чисто "механических" параметров соединения, должно быть
обеспечено совпадение и некоторых "физических" параметров, таких как напряжение и
частота. Этот пример можно немного усложнить, добавив к функциям соединения
функцию передачи данных (PLC, Power line communication). Например, с помощью
PowerLine-модемов (адаптеров) TRENDnet можно позволяет легко соединять два
компьютера или даже создавать небольшие защищенные скоростные сети передачи
данных в масштабах здания, используя любые электрические розетки. На рисунке
представлен адаптер TRENDnet TPL-402E2K. Так ненавязчиво мы пришли к понятию
"протокол", ведь кроме розетки RJ45 для витой пары, устройство гарантирует
поддержку обмена данными по протоколу Ethernet в соответствии со стандартами IEEE
802.3, IEEE 802.3x, IEEE 802.3u, IEEE 802.3ab.
Сетевой адаптер
TRENDnet TPL-402E2K
Разработчик изделия компания
TRENDnet, основанная в городе Торранс,
штат Калифорния. Со временем она
превратилась в одного из ведущих
мировых производителей оборудования
для сетей передачи данных небольших
масштабов. Сайт компании доступен по
адресу:
http://www.trendnet.com/langru/
Но вернемся к нашему аппаратно-программному комплексу, который можно
схематично представить в виде трех отдельных слоев, которые взаимодействуют
друг с другом посредством различных интерфейсов.
9
Схема взаимодействия слоев.
Уже много лет назад стало очевидно, что нужно как-то оградить
программистов от тонкостей, связанных с аппаратным обеспечением. Постепенно
был выработан следующий путь: поверх аппаратуры работает дополнительная
программная прослойка, которая управляет всем оборудованием и предоставляет
пользователю интерфейс, или виртуальную машину, более простую для понимания и
программирования, чем аппаратура.
Прикладные программы, в том числе и разрабатываемые пользователем,
располагаются на самом высоком уровне. Они не могут и недолжны напрямую
работать с устройствами комплекса. Программы взаимодействуют с операционной
системой посредством программного интерфейса API, представляющего собой набор
модулей выполняющих стандартные функции, которые вызываются программой, для
того чтобы операционная система выполнила необходимые действия. Так как API
зависит от операционной системы, структура и команды интерфейса различаются на
разных компьютерах. Но независимо от конкретной операционной системы API
позволяет программе выполнить задание, даже если пользователь не знает, как
операционная система добивается этого. Программа не должна ничего знать об
устройствах комплекса.
Операционная система (operating system) представляет собой сложный
комплекс управляющих и обрабатывающих программ, которые образуют следующий
10
слой между устройствами вычислительного комплекса и прикладными программами.
Основные функции ОС — управление устройствами, управление вычислительными
процессами, распределение ресурсов комплекса между вычислительными процессами.
Конечно, каждая операционная система разрабатывается под вполне определенную
архитектуру набора команд (ISA, instruction set architecture): построение памяти,
порядок взаимодействия с внешними устройствами, машинные команды, режимы
адресации, используемые регистры, типы внутренних данных, обработчики
прерываний и исключительных состояний. В настоящее время архитектура набора
команд персональных компьютеров представлена тремя вариантами, которые
обозначаются: IA-16 (1978, 16-бит), IA-32 (1985, 32-бит) и IA-64 (2003, 64-бит). Здесь
IA-ХХ - Intel Architecture с разрядностью ХХ.
Напомню, в брошюре "Фрагмент 1. Первые шаги к успеху" уже указывал, что на
моем персональном компьютере установлена операционная система Windows XP
Professional версии 2002 (SP3), которая ориентирована на CISC-компьютеры (CISC,
Complex instruction set computer - компьютер с полным набором команд) с архитектурой
IA-32. Кроме CISC-компьютеров распространены (например, в системах АСУ ТП)
RISC-компьютеры (restricted instruction set computer — компьютер с сокращённым
набором команд) — архитектура процессора, в которой быстродействие увеличивается
за счёт упрощения инструкций, чтобы их декодирование было более простым, а время
выполнения — меньшим.
Следующий, самый нижний слой на схеме – аппаратные средства комплекса,
которые взаимодействуют с операционной системой через интерфейс BIOS. BIOS
(basic input/output system — базовая система ввода-вывода) — реализованная в виде
микропрограмм часть системного программного обеспечения, которая предназначается
для предоставления операционной системе доступа к аппаратуре комплекса. В
персональных компьютерах BIOS представляет собой набор записанных в микросхему
EEPROM (Electrically Erasable Programmable Read-Only Memory — электрически
стираемое перепрограммируемое ПЗУ) микропрограмм, обеспечивающих начальную
загрузку компьютера и последующий запуск операционной системы. В процессе
функционирования комплекса операционная система сообщает BIOS о том, что нужно
сделать по запросу приложения (операционная система не взаимодействует напрямую с
устройствами).
Слой BIOS позволяет операционной системе поддерживать все входящие в
комплекс устройства. Каждое из них представлено своей частью микропрограмм в
EEPROM и/или драйвером, который становятся частью BIOS всего комплекса. Поэтому
слой BIOS является относительно динамичным и изменяется в соответствии с любыми
модификациями аппаратной части комплекса. Он предназначен для того, чтобы
сглаживать несоответствия между различными устройствами с помощью единого
интерфейса операционной системы. Операционной системе достаточно знать, как
взаимодействовать со слоем BIOS. Слой BIOS является главным связующим звеном
между операционной системой и слоем аппаратных средств. Поэтому слой BIOS так
важен для любой компьютерной системы.
Такая вот "матрешка получилась... Но сказана в лучшем случае только
десятая часть того, что необходимо для систематического программирования...
11
3.2. Еще раз о материнской плате.
Вот ведь неугомонные читатели-программисты – понятно, что эти брошюры
задуманы для иллюстрации возможностей компилятора FreeBASIC при выполнении
обычных математических алгоритмов. Так нет же – подавай им подробности про
аппаратную часть – не хватает картинки материнской платы... Ну да ладно – хотя бы
имеет отношение к теме "Виртуальная машина инженера"... Получите:
Материнская плата (MotherBoard, MainBoard) или системная плата (System
board) — сложная многослойная печатная плата, являющаяся основой построения
вычислительного комплекса. На неё монтируются чипы (интегральные микросхемы
различной степени интеграции), разъемы и прочие компоненты. В качестве основных
(несьёмных) частей материнская плата имеет разъём процессора, микросхемы чипсета,
компоненты BIOS и некоторых устройств ввода-вывода. Оперативная память (ОЗУ) в
виде модулей памяти устанавливаются в специально предназначенные разъёмы; в
12
слоты расширения устанавливаются карты расширения. Дополнительная система
охлаждения и периферийные устройства монтируются внутри шасси, в совокупности
формируя системный блок компьютера.
Чипсет (chipset) — самая важная часть системной платы. Он состоит, как
правило, из двух частей — "северного" и "южного" моста. Обычно северный и южный
мост расположены на отдельных чипах (кристаллах микросхем). Именно северный и
южный мосты в значительной степени определяют особенности системной платы и
архитектуры персонального компьютера, а также возможность подключения к ней
устройств ввода-вывода.
В брошюре "Фрагмент 1. Первые шаги к успеху" уже сказано, что в основе
используемого компьютера лежит интегрированная материнская плата GA-EG41MFTUS2H компании Giga-Byte Technology Co., Ltd. - тайваньская компания по
производству системных плат, видеокарт и другой компьютерной техники. Компания
основана в 1986, изначально представляла собой группу исследователей и
разработчиков, за годы своего развития компания превратилась в одного из мировых
лидеров рынка системных плат и графических 3D-ускорителей.
Если нет опыта самостоятельной работы на компьютере, то рекомендую
воспользоваться маленькой, но достаточно мощной программой SIW (System
Information for Windows) для отображения подробной информации об аппаратном и
программном обеспечении компьютера. Разработчик программы канадская фирма
"Gabriel Topala", ее сайт:
http://www.gtopala.com/
В свое время стащил эту программу с сайта:
http://irokkezz.ru/portable/system/391-portable-siw-20120106-technician-rus.html
Язык интерфейса: многоязычный (в том числе русский). SIW отображает данные
об операционной системе, установленных программах, службах и процессах, файлах,
кодеках, регистрационных данных приложений. Информация об аппаратной части
включает данные о материнской плате, процессоре, оперативной памяти, видеокарте,
мониторе, дисках, BIOS и другом оборудовании. В архиве находится компактная
зарегистрированная русская версия SIW 2012.01.06 Technician не требующия
установки. Для запуска необходимо просто распаковать архив в удобное место на диске
и запустить исполняемый файл siw.exe. Настройки программы сохраняются
автоматически в файле siw_init.xml.
И последнее: даже если у Вас нет вопросов по материнской плате – рекомендую
иметь под рукой книгу Скотта Мюллера [03], которая стала международным
бестселлером и превратилась в стандарт де-факто в среде компьютерных специалистов
во всем мире. Системные платы и шины персонального компьютера описаны в главе 4.
13
3.3. Библиотека для воспроизведения звука FMOD.
Читатели напомнили о сказанном в брошюре "Фрагмент 10. В мире звуков" в
главе "Программирование звуковых эффектов": совместно с компилятором FreeBASIC
может успешно использоваться библиотека FMOD, ее нетрудно найти в сети и
установить в системе. Оказалось, что это не совсем так, хотя многие знают, что FMOD
это великолепная и бесплатная для некоммерческого использования, библиотека
работы со звуком. Тому лучшее доказательство – страничка на живом и
познавательном сайте Станислава Будинова:
http://freebasic.ucoz.com/forum/4-184-1
Тема: "Музыка". Вопрос от пользователя "Rolover" (22.07.2013):
Музыку реально подключить или проигрывать в программах на FB?
Особенно интересуют в играх звуковые эффекты ну и фоновая мелодия...
3.3.1. Общее о DLL-библиотеках.
В этой теме была упомянута библиотека FMOD. Продукт имеет два
неоспоримых достоинства:
Простота программирования FMOD.
Легкость установки.
Разработчиком программного продукта является компания
Technologies Pty, Ltd., расположенная в Австралийском городе Мельбурн.
Firelight
Заголовочный файл библиотеки включен в дистрибутив поставки FreeBasic:
...\Compilier\inc\fmod.bi
Скачать библиотеку FMOD.DLL можно, например, с многоязычного и богатого сайта:
http://ru.dll-files.com/
На сайте организован поиск необходимого файла по первой букве с последующим
выбором из таблицы имен:
http://ru.dll-files.com/fmod.dll.html
Описание файла FMOD:
версия: 3.7.5.0
размер файла: 0.15 Mb
язык файла: English - Australia
Из скаченного с сайта архива fmod.zip (размер: 155 467 b) необходимо извлечь
библиотеку fmod.dll (размер 162 816 b) в системную папку. Для операционных систем
Windows XP, Vista, 7 эта папка называется:
C:\Windows\System32\
14
После внедрения на персональных компьютерах операционной системы MS
Windows,
в
составе
системного
программного
обеспечения
появились
специализированные библиотеки, допускающие так называемую динамическую
компоновку (DLL, Dynamic Link Library), в которых содержатся необходимые модули
для реализации наиболее часто используемых функций. Практически все Windowsпрограммы в процессе своей работы обязательно обращаются к десяткам
общедоступных библиотек. Среди них наиболее значимые:
Kernel32.dll – набор стандартных системных функций Windows для работы с
файлами, памятью, для запуска и завершения процессов и потоков и т.п.
User32.dll – системные функции реализующие элементы управления для
поддержки оконного интерфейса, мыши и клавиатуры в пользовательских
приложениях.
gdi32.dll – Функции интерфейса графических устройств (GDI) для вывода на
устройства, например для управления рисованием и шрифтами.
Hal.dll – функции адаптации или Hardware Abstraction Layer - уровень
аппаратной абстракции. Именно благодаря наличию такого уровня Windows
имеет возможность работы на разных аппаратных платформах.
Ntdll.dll - своеобразный мост между библиотеками, которые работают в режиме
ядра и библиотеками, работающими в пользовательском режиме. Эти режимы
имеют ряд существенных отличий, и без этой библиотеки было бы невозможно
применять многие старые приложения в новых версиях Windows.
Advapi32.dll – функции обслуживания системного реестра. ОС Windows
предоставляет пользовательским приложениям специальные функции доступа к
реестру.
Mpr.dll – функции для работы с сетью. Взаимодействие с другими
компьютерами в локальной сети, поддержка работы с сетевыми устройствами,
поддержка соединения - вот далеко не полный список того, что ложится на
плечи этой библиотеки.
Msvcrt.dll - ряд вспомогательных функций для работы с памятью, устройствами
ввода и вывода, математическими функциями.
Нередко полезные библиотеки DLL появляются на компьютере вместе со вновь
устанавливаемыми приложениями. Кроме того, прикладной программист может
создавать дополнительные DLL библиотеки самостоятельно. "Типичная" DLL
представляет собой файл, содержащий набор некоторых процедур и функций. Для того
чтобы к этим подпрограммам можно было обращаться из программ пользователя, в
DLL имеется специальная "таблица экспорта", которая содержит имена функций и их
стартовые адреса ("точки входа") внутри файла библиотеки. В "типичной" прикладной
программе для доступа к функциям DLL создается "таблицы импорта", в которые
вносятся имена DLL-библиотек и тех модулей, которые прикладную программу
интересуют.
Каждое объявление (декларация) процедуры или функции в тексте фрагмента
будущей программы — это обещание компилятору, что где-то в другом месте
программы есть определение этой процедуры или функции. Часть таких обещаний
выполняет сам компилятор, вставляя необходимые фрагменты, а часть обещаний
перекладывается "на плечи" специальной утилиты – компоновщика. Компоновщик
(редактор связей, линкер — link editor, linker) — программа, которая производит
компоновку: принимает на вход один или несколько объектных модулей (в том числе
модуль пользователя и модули из специальных библиотек) и собирает из них
15
исполняемый модуль. В брошюре "Фрагмент 2. Все еще впереди" была приведена
схема создания программных модулей. На ней видно, что кроме собственно
компилятора fbc.exe в работе принимает участие и утилита ld.exe, она находится среди
файлов поставки компилятора FreeBASIC:
...\Compilier\bin\win32\ld.exe
Доступ к подпрограммам dll-библиотеки можно получить с помощью Win32 API
функций LoadLibrary, FreeLibrary и GetProcAddress. При импорте подпрограмм данным
способом, библиотека загружается только при вызове функции LoadLibrary и
выгружается при вызове функции FreeLibrary. Это позволяет уменьшать требуемое
количество памяти и запускать приложение, даже если какие-то библиотеки
отсутствуют на компьютере.
Функция LoadLibrary ищет и загружает dll-библиотеку по переданному ей
имени. Поиск осуществляется в тех же директориях, что и при статическом
подключении. Функция возвращает идентификатор библиотеки, если
библиотека была найдена, и значение 0 в противном случае.
Функция GetProcAddress осуществляет поиск нужной процедуры в dllбиблиотеке. Функция получает идентификатор библиотеки и имя или номер
процедуры и возвращает указатель на процедуру, если она была найдена, и 0 в
противном случае.
Функция FreeLibrary освобождает dll-библиотеку. Однако библиотека может не
выгружаться из памяти, если она используется другими приложениями.
При динамическом подключении dll-библиотеки компилятор не может
проверить типы и количество передаваемых параметров. Поэтому программист сам
должен следить за тем, чтобы процедура получила корректный набор параметров.
Динамическое подключение dll-библиотек более трудоёмко, чем статическое, т.к.
нужно самостоятельно вызывать все необходимые функции и проверять возвращаемые
ими значения. Кроме того, при динамическом подключении генерируется чуть более
объёмный код. Но динамическое подключение является более гибким механизмом. При
статическом подключении в случае отсутствия необходимой dll-библиотеки
приложение просто не запустится. При динамическом подключении в случае
отсутствия dll-библиотеки программист может предпринять какие-либо действия,
например, попытаться загрузить другую библиотеку или позволить пользователю
работать с теми функциями приложения, которые определены не в отсутствующей
библиотеке.
В дальнейшем идея "всеобщей модульности", заложенная в DLL-библиотеки,
выросла в концепции Component Object Model (COM, объектная модель компонентов)
и System Object Model (SOM, объектно-ориентированная динамическая библиотека).
Модель SOM считается более функциональной, чем модель COM. Но беда в том, что
фактически, полных преимуществ от внедрения динамически подключаемых
библиотек получить не удалось по причине явления, называемого DLL hell (DLL ад).
А учитывая, что DLL-библиотеки допускают два способа подключения модулей к
прикладным программам:
1. динамическое подключение модулей;
2. статическое подключение модулей;
16
там, где это не оговорено особо, будем полагать, что применяется способ статического
подключения модулей. Ответ на вопрос: что следует использовать — статическую или
динамическую компоновку зависит от типа приложения, которое создается. Если
создается одно приложение небольшого объема, лучше использовать статическую
компоновку. И только для очень больших приложений или приложений с большим
числом библиотечных модулей следует серьезно подумать о динамической
компоновке.
3.3.2. Введение в использование библиотеки FMOD.
Ниже приведены две программы на языке FreeBASIC, каждая из которых
выдает на экран монитора номер используемой версии библиотеки FMOD.DLL, но
первая написана в предположении о статической компоновке исполняемого модуля, а
вторая - в предположении о динамической компоновке исполняемого модуля. Когда
для приложения использована статическая компоновка, весь код, который требуется
для запуска приложения, расположен непосредственно в исполняемом EXE-файле. Во
втором случае часть кода берется из DLL-библиотеки.
'
P R O G R A M "_VirtMach_FMOD01S"
'
16.02.2014
'------------------------------------------------------------'
Специализированная библиотека для работы со звуком FMOD
'------------------------------------------------------------'
' Заголовочный файл библиотеки FMOD.DLL содержит предписание:
' ...\Compilier\inc\fmod.bi
' function FSOUND_GetVersion alias "FSOUND_GetVersion" as
Single
' Вариант 1: статическая компоновка (static linking)
'
#Lang "FB"
' режим FreeBASIC-совместимости
#Include "fmod.bi" ' подключить заголовочный файл
Dim As Single FMODver
' определить переменную
FMODver = FSOUND_GetVersion
' получить версию
Print " FMOD version = "; FMODver ' вывод версии = 3.75
Sleep
Как можно убедиться, текст программы совсем несложный и не требует
дополнительных пояснений. Текст второй программы более тяжелый.
'
P R O G R A M "_VirtMach_FMOD01D"
'
16.02.2014
'------------------------------------------------------------'
Специализированная библиотека для работы со звуком FMOD
'------------------------------------------------------------'
' Использован пример с сайта Станислава Будинова:
' http://freebasic.ucoz.com/forum/19-178-1
' Вариант 2: динамическая компоновка (dynamic linking)
'
17
#Lang "FB"
' режим FreeBASIC-совместимости
#Inclib "fmod.dll"
' подключать библиотеку
Dim As Any Ptr Library
Dim Func As function() As Single ' указатель на функцию
Dim As Single FMODver
Do
' начало большого цикла выполнения программы
' загрузить библиотеку в память и получить ее идентификатор
Library = DyLibLoad("fmod.dll")
' проверить наличие искомой библиотеки
If Library = 0 Then
' если библиотека не загрузилась остановить программу
Print " Failed to load thefmod.dll, aborting program..."
Else
' если библиотека загрузилась продолжить выполнение
Print " Library fmod.dll is loaded..."
' получить адрес функции в библиотеке
Func = DylibSymbol(Library, "_FSOUND_GetVersion")
' проверить наличие искомой функции в библиотеке
If Func = 0 Then
' если не удалось получить адрес функции
Print " Could not retrieve the function address..."
Else
' если получен адрес функции
Print " Address of the function _FSOUND_GetVersion = ";
Func
' получить номер версии библиотеки
FMODver = Func()
Print " FMOD version = "; FMODver
End If
DylibFree(Library)
End If
Exit Do
Loop
' конец большого цикла выполнения программы
Sleep
Ниже приведена программа на языке FreeBASIC, демонстрирующая начальное
обращение к модулям библиотеки FMOD.DLL в режиме статической компоновки. Для
использования модулей из библиотеки ее нужно инициализировать. Это делается с
помощью функции FSOUND_Init(), с указанием необходимых параметров:
mixRate - требуемая частота дискретизации;
maxChan - максимальное количество программных каналов;
ExFlag - флаг расширения.
Не будет большой ошибкой указать частоту дискретизации 48000 Гц, 8 каналов
и отсутствие флага расширения. Кроме того в программе продемонстрировано
использование функций:
FSOUND_GetError – дать код ошибки,
FSOUND_GetErrorString(ErrCode) – дать имя ошибки,
FSOUND_Close – закрыть библиотеку.
18
'
P R O G R A M "_VirtMach_FMOD02"
'
16.02.2014
'------------------------------------------------------------'
Специализированная библиотека для работы со звуком FMOD
'------------------------------------------------------------'
#Lang "FB"
' режим FreeBASIC-совместимости
#Include "fmod.bi"
Dim as Integer mixRate, maxChan, ExFlag, ErrCode
mixRate = 48000
' требуемая частота дискретизации
maxChan = 8
' максимальное количество каналов
ExFlag = 0
' флаг расширения
'
FSOUND_Init(mixRate, maxChan, ExFlag)
ErrCode = FSOUND_GetError ' получить код ошибки
Print " Error: "; FSOUND_GetErrorString(ErrCode)
Print " Initialization performed"
' Здесь располагается основной код программы!
FSOUND_Close
Sleep
При выполнении программа выводит на экран:
Error: No errors
Initialization performed
что и следовало ожидать!
Как правило, выбор "базовой системы" производится до вызова функции
инициализации FSOUND_Init(). Следует обратить внимание на пару важных функций:
FSOUND_SetOutput()/FSOUND_GetOutput() - выбрать/получить базовую звуковую
систему (Windows Multimedia, DirectSound, A3D и т.п.).
В качестве параметра для автоматического определения базовой звуковой
системы в функцию FSOUND_SetOutput можно передать -1 (0FFFFFFFFh) и проверить
результат информационными функциями:
FSOUND_GetOutputRate - показать частоту дискретизации;
FSOUND_GetMaxChannels - показать максимальное количество каналов;
как это сделано в программе ниже:
'
P R O G R A M "_VirtMach_FMOD03"
'
16.02.2014
'------------------------------------------------------------'
Специализированная библиотека для работы со звуком FMOD
'------------------------------------------------------------'
#Lang "FB"
' режим FreeBASIC-совместимости
#Include "fmod.bi"
Dim as Integer mixRate, maxChan, ErrCode, OutpS
'
19
OutpS = -1
' система по умолчанию
FSOUND_SetOutput(OutpS) ' установить режим
ErrCode = FSOUND_GetError
Print " Error: "; FSOUND_GetErrorString(ErrCode)
' получить параметры режима
mixRate = FSOUND_GetOutputRate
maxChan = FSOUND_GetMaxChannels
Print " OutputRate = "; mixRate
Print " MaxChannels = "; maxChan
FSOUND_Close
Sleep
При выполнении программа выводит на экран:
Error: No errors
OutputRate = 44100
MaxChannels = 0
Этот режим устанавливается по умолчанию каждый раз при запуске программы,
текст которой приведен ниже.
'
P R O G R A M "_VirtMach_FMOD04"
'
16.02.2014
'------------------------------------------------------------'
Специализированная библиотека для работы со звуком FMOD
'------------------------------------------------------------'
#Lang "FB"
' режим FreeBASIC-совместимости
#Include "fmod.bi" ' заголовочный файл
Dim as Integer mixRate, maxChan, ExFlag, ErrCode, OutpS
'
OutpS = FSOUND_GetOutput ' получить режим
Print " Output: "; OutpS ' выводит -1
ErrCode = FSOUND_GetError
Print " Error: "; FSOUND_GetErrorString(ErrCode)
' получить параметры режима
mixRate = FSOUND_GetOutputRate
maxChan = FSOUND_GetMaxChannels
Print " OutputRate = "; mixRate
Print " MaxChannels = "; maxChan
FSOUND_Close
Sleep
3.3.3. Загрузка и воспроизведение образцов.
В этом пункте рассмотрим полезную функцию FSOUND_Sample_Load(). Как
можно догадаться, она загружает образец из указываемого файла, декодирует его и
возвращает в программу указатель ID для дальнейшего использования. Функция
поддерживает распространенные форматы: *.wav, *.mp2, *.mp3, *.ogg, *.raw и др.
20
'
P R O G R A M "_VirtMach FMOD05"
'
16.02.2014
'------------------------------------------------------------'
Специализированная библиотека для работы со звуком FMOD
'------------------------------------------------------------'
#Lang "FB"
' режим FreeBASIC-совместимости
#Include "fmod.bi" ' заголовочный файл
Dim As Integer mixRate, maxChan, ExFlag, ErrCode
Dim As Any Ptr mySample
Dim As String NamSample = "C:\WINDOWS\Media\tada.wav"
' в примере используется "системный" звук "Та-Да"
mixRate = 44100
' требуемая частота дискретизации
maxChan = 1
' максимальное количество каналов
ExFlag = 0
' флаг расширения
' инициализация должна быть хотя бы минимальной!
' если FSOUND_Init() отсутствует, то обнаруживается ошибка!
FSOUND_Init(mixRate, maxChan, ExFlag)
' если положить maxChan = 0, то ошибка не появляется,
' но вывод звука отсутствует
mySample = FSOUND_Sample_Load(FSOUND_FREE, NamSample, 0, 0, 0)
If mySample = 0 Then
Print " Error: Failed to load the sample!"
Else
FSOUND_Sample_SetMode(mySample, FSOUND_LOOP_NORMAL)
FSOUND_PlaySound(FSOUND_FREE, mySample)
Print " Repetition of the fragment before pressing!"
While InKey$ = "" ' пока не нажата повторять!
FSOUND_Update
Wend
EndIf
FSOUND_Close
Sleep
Описание подробностей неминуемо потребовало бы еще ни одной брошюры!
Так что – простите, переходим к следующей программе.
3.3.4. Загрузка и воспроизведение мелодий.
При рассмотрении модулей библиотеки FMOD принято называть "мелодией"
MIDI-файлы (*.mid — укороченное расширение файлов в формате MIDI) или файлы
"модульной музыки", т.е. файлы, в которых содержаться музыкальные произведения.
Есть множество форматов файлов, наиболее распространенные из них: *.mod
(устаревший, но еще живой в многочисленных архивах формат), *.xm (с ним работает
серия FastTracker и все современные трекеры), *.s3m (серия ScreamTracker). Любой
модуль хранит в себе информацию о нотах и применяемых эффектах, нечто вроде
партитуры, и сэмплы, то есть звуки, которые используются в композиции.
В простейшем случае загрузка и воспроизведение мелодий выполняется так, как
это показано в программе на языке FreeBASIC приведенной ниже. В отличие от
функции FSOUND_Sample_Load() функция FMUSIC_LoadSong(), которая будет
21
использоваться чтобы загрузить файл мелодии принимает только один аргумент: имя
файла и возвращает идентификатор ссылки ID.
'
P R O G R A M "_VirtMach FMOD06"
'
16.02.2014
'------------------------------------------------------------'
Специализированная библиотека для работы со звуком FMOD
'------------------------------------------------------------'
#Lang "FB"
' режим FreeBASIC-совместимости
#Include "fmod.bi"
' заголовочный файл
#Include "windows.bi" ' логические переменные
' исполняется затейливая мелодия размер 21,5 Kb, время 01:19
Dim As String FileMusic = "C:\WINDOWS\Media\town.mid"
' исполняется затейливая мелодия размер 39,1 Kb, время 04:08
'Dim As String FileMusic = "C:\WINDOWS\Media\onestop.mid"
Dim BackgroundMusic As Any Ptr
Dim As Integer mixRate, maxChan, ExFlag
mixRate = 44100: maxChan = 1: ExFlag = 0
' инициализация должна быть обязательно:
FSOUND_Init(mixRate, maxChan, ExFlag)
BackgroundMusic = FMUSIC_LoadSong(FileMusic)
If BackgroundMusic = 0 Then
Print " Error: Failed to load the MIDI file!"
Else
Print " Melody sounds from file"
FMUSIC_SetLooping(BackgroundMusic, TRUE)
FMUSIC_PlaySong(BackgroundMusic)
While InKey$ = "" ' пока не нажата повторять!
FSOUND_Update
Wend
EndIf
FSOUND_Close
Print " Program is completed!"
Sleep
В программе использована функция FMUSIC_SetLooping(Pointer, Looping) для
организации повторения мелодии. Ее параметры:
Pointer – указатель на мелодию;
Looping – TRUE бесконечный цикл или FALSE проигрывать только один раз.
Для прерывания бесконечного цикла используется нажатие любой клавиши.
Хорошие мелодии в формате *.mid доступны на музыкальном сайте:
http://midimelody.ru/
22
В брошюре использованы материалы из книг:
[01] Вонг А. Оптимизация BIOS. Полный справочник по всем параметрам BIOS и их
настройкам. М.: 2011. 272 с.
[02] Франкл В. Человек в поисках смысла. М.: 1990. 368 с.
[03] Мюллер C. Модернизация и ремонт ПК. М.: 2011. 1074 с.
Как всегда расстаюсь не без сожаления – задумано было одно,
а получилось совсем другое!
Не знаю, смог ли удовлетворить хоть немного пожелания читателей...
Надеюсь что брошюра, тем не менее, будет полезна многим
инженерам, начинающим самостоятельно изучать язык FreeBASIC...
Но сегодня лимит времени и объема брошюры исчерпан!
На этом позвольте закруглиться.
До новых встреч!
Пишите: eugene_r@mail.ru
Документ
Категория
Информатика
Просмотров
300
Размер файла
699 Кб
Теги
программа, интерфейс, музыка, freebasic, fmod
1/--страниц
Пожаловаться на содержимое документа