среда, 17 февраля 2010 г.

Продцедуры и функции

Продолжаем знакомиться с InlineCode и, естественно, с языком Pascal. Сегодня мы рассмотрим, как заставить выполняться желаемый код, и напишем (да, напишем, раз уж речь идёт о коде) нашу первую программу с использованием InlineCode.

В тот InlineCode (для краткости я буду именовать его просто IC), который мы поставили на рабочее поле, ещё нельзя писать какие-либо действия. Дело в том, что весь код разбивается на логические участки - процедуры и функции, а вот в них уже можно писать какие-либо действия. Но у нас пока нет ни одной процедуры или функции. Давайте же сделаем хотя бы одну.



Итак, здесь записана процедура Proba. В разделе Public написано следующее:

procedure Proba(var dt:TData; index:word);

В этом разделе мы только объявляем процедуры, то есть даём понять, что они у нас будут использоваться.

procedure - это ключевое слово, которое и обозначает начало процедуры.
(var dt:TData; index:word); - это параметры процедуры, то есть информация которая может быть передана процедуре при вызове этой процедуры.

В данном случае параметра два: dt и index, а имеют они типы соответственно TData и word. TData - это специальный тип, который используется в HiAsm. Он может содержать практически любые данные: картинку, звук, строку, число и т. д. Word - это число, состоящее из двух байт. Я уже про это рассказывал, можете почитать тут.

Есть ещё слово var, оно означает, что данный параметр является переменной и его можно менять в процедуре, но об этом - позже.

Ниже, в разделе implementation, записано следующее:

procedure THiAsmClass.Proba;
begin

end;



Здесь уже процедура записывается для выполнения в ней действий. При этом следует помнить, что она относится к модулю ThiAsmClass, а потому перед её именем стоит название этого класса.
begin и end - это особые ключевые слова, которые очень часто используются в Pascal. Они обозначают начало и конец чего-либо. В данном случае - это начало и конец процедуры. То есть, при вызове процедуры Proba будет выполняться только то, что написано между begin и end. Обратите внимание на точку с запятой. Они ставятся почти после каждой строки, крое некоторых, например begin. Именно точка с запятой отделяет команды друг от друга.

Наверняка у вас возник вопрос: а как вызывать процедуру? В HiAsm процедуры вызываются через точки. Вы уже заметили, что у IC есть точка метода? Она появилась не автоматически - её надо прописывать в соответствующем параметре компонента, её имя должно совпадать с именем процедуры. Имя процедуры можно писать только на латинице и цифрах, но начинаться обязательно должно с буквы. Большие и маленькие буквы в названиях процедур, переменных, функций равнозначны (т.е. proba и ProBa - одно и то же).

Обратите также внимание, что наша процедура объявлена в разделе Public, но не Private! Только из процедур раздела Public можно сделать внешние точки у IC, иначе программа не будет запускаться.

Кстати, давайте-ка запустим нашу программу и посмотрим.



Конечно же, у нас ничего не происходит, потому что в процедуре ещё ничего не написано. Однако программа запускается - это уже хорошо. А вот если она не запускается, не компилируется, значит, вы где-то допустили ошибку при написании кода. В этом случае выполните «Вид» - «Панель Отладка» и посмотрите, в какой строке у вас ошибка. Сообщения с ошибками в Отладке написаны красным цветом.

Теперь хочется что-нибудь вставить в процедуру, чтобы убедиться, что она действительно вызывается. Для начала попробуем простое сообщение, такое, какое можно видеть на вкладке «Контролы». Конечно, для этого надо знать функцию, которая вызывает это сообщение. Это внешняя функция, нам её писать не надо, она уже написана в других файлах. Нам нужно лишь указать её имя в процедуре, это и будет вызов функции.



MessageBox(0,'Привет!','Сообщение',0);

Итак, разберём всё по порядку.

MessageBox - собственно название функции, которую мы вызываем. Она-то и показывает сообщение. Только обратите внимание, что сама функция прописана в модуле windows, поэтому мы его подключаем в раздел uses.

(0,'Привет!','Сообщение',0); - параметры функции. У каждой функции свои параметры, у этой вот - четыре. Первый параметр определяет идентификатор родительского окна. У нас 0, значит, у нашего сообщения не будет родительского окна.
Второй параметр определяет текст сообщения. Любой текст в языке Pascal всегда берётся в одинарные кавычки.
Третий параметр определяет заголовок сообщения.
Четвёртый параметр определяет иконку в окне сообщения и набор кнопок. У нас самый простой, под номером 0 - это отсутствие иконки и одна кнопка «ОК».

И, конечно, точка с запятой в конце.


А теперь выясним, что же такое функция. По сути, это то же самое, что и процедура, только функция может возвращать после своего выполнения каое-либо значение. И это значение можно использовать. Например, можно написать функцию вычисления какого-то математического выражения и использовать эту функцию множество раз.



Итак, здесь написана функция mat, а в объявлении этой функции после скобок стоит двоеточие и тип integer. Integer - это целое число, помещающееся в 4 байта. Здесь об этом тоже написано. Это значит, что функция будет возвращать число. А какое - зависит от кода в этой функции, который мы пока не написали.



Здесь в функции уже написано математическое выражение. Употреблён новый для вас символ «:=» - символ присваивания. Это значит, что переменно Result мы присваиваем то, что получается при выполнении математической операции. А Result - это специальная переменная, которая и возвращается функцией. Она нигде специально не указывается, и ей можно сразу присваивать значения в функции.

x и y - это параметры функции, они тоже типа integer.

Ну а теперь давайте-ка вызовем функцию из нашей процедуры и выведем в сообщении результат.



Что же означает эта конструкция: PChar(int2str( mat(1,7) ))?

Разберёмся по порядку.
mat(1,7) - это вызов нашей функции с параметрами 1 и 7. Они будут соответственно использованы как x и y.
int2str - это функция преобразования числа в строку, она тоже внешняя. Дело в том, что в Pascal различаются разные типы данных, и в сообщении вывести можно только строку, а функция возвращает число. Для пользователя, конечно, разницы не видно, но Pascal упрям… В скобках передаётся наша функция, а точнее - её результат, который является, в свою очередь, параметром к функции int2str.
PChar - указатель на строку. Функция MessageBox принимает строки через указатели на них. Если вы незнакомы с Pascal и указателями, то это для вас пока будет сложно понять. Просто запомните, что желательно все строки в MessageBox передавать через указатель. И если для прямо указанных строк это необязательно (например, строку «Сообщение» мы передали просто так), то для строк через функции это обязательно.

На сегодня всё. Потренируйтесь в написании кода в IC, поэкспериментируйте, приобретайте навыки.






Портал для веб-программистов, желающих заработать в Сети и других - web 2.0. Вы найдёте статьи о соц.сетях, AJAX, SEO. И конечно, статьи о веб-программировании и заработке в Интернете.

Хотите сделать себе кофе - большой выбор jura - швейцарских кофемашин. Качественные приборы, вкусный кофе.

Хотите приобрести тур в Мексику - сходите на этот сайт. Там вы найдёте разную информацию о Мексике, стоимость туров, отели Мексики, фотографии страны и другие интересные вещи о Мексике.

2 комментария:

  1. Отличные статьи , подробные и главное с примерами! Для меня как для новичка в HiAsm все статьи понятны и полезны. Плучилось сделать свой первый простенький IC код , огромное спасибо автору за проделанные труды!

    ОтветитьУдалить