Что такое прототип процедуры

Прототип функции

Прототипом функции в языке Си или C++ называется объявление функции, которое не содержит тело функции, но указывает имя функции, арность, типы аргументов и возвращаемый тип данных. В то время как определение функции описывает, что именно делает функция, прототип функции может восприниматься как описание её интерфейса.

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

Содержание

Пример

В качестве примера, рассмотрим следующий прототип функции:

Этот прототип объявляет функцию с именем «foo», которая принимает один аргумент «n» целого типа и возвращает целое число. Определение функции может располагаться где угодно в программе, но определение требуется только в случае её использования.

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

Уведомление компилятора

Если функция предварительно не была объявлена, а её имя встречается в выражении, следующим за открывающей скобкой, то она неявно объявляется как функция, возвращающая результат типа int и ничего не предполагается о её аргументах. В этом случае компилятор не сможет выполнить проверку типов аргументов и арность, когда функция вызывается с некоторыми аргументами. Это потенциальный источник проблем. Следующий код иллюстрирует ситуацию, в которой поведение неявно объявленной функции не определено.

Функция «foo» ожидает аргумент целого типа, находящийся в стеке при вызове. Если прототип пропущен, компилятор не может это обработать и «foo» завершит операцию на некоторых других данных стека (вероятно, это будет обратный адрес или значение переменной, не входящей в область допустимых значений). Включением прототипа функции вы информируете компилятор о том, что функция «foo» принимает один аргумент целого типа и вы тем самым позволяете компилятору обрабатывать подобные виды ошибок.

Создание библиотечных интерфейсов

Путем помещения прототипов функций в заголовочный файл можно описывать интерфейс для библиотек.

Объявления класса

В C++ прототипы функций также используются в определении классов.

Ссылки

  • Kernighan, Brian W. & Ritchie, Dennis M. (1988), «The C Programming Language» (2nd ed.), Upper Saddle River, NJ: Prentice Hall PTR, ISBN 0131103628  

См. также

  • Сигнатура типа
  • Язык программирования Си

Wikimedia Foundation . 2010 .

Полезное

Смотреть что такое «Прототип функции» в других словарях:

Прототип — (от др. греч. πρῶτος  первый и τύπος  отпечаток, оттиск; прообраз, образец), Prototype: Прототип (когнитивная психология)  абстрактный образ, воплощающий множество сходных форм одного и того же объекта или паттерна, наиболее… … Википедия

прототип — ПРОТОТИП (от греч. prototypon прообраз) в когнитивистике лучший представитель («лучший пример») когнитивной или языковой категории. Теория прототипов разрабатывалась параллельно в когнитивной психологии (Л.С. Выготский, Э. Рош),… … Энциклопедия эпистемологии и философии науки

strcpy — strcpy  функция стандартной библиотеки языка программирования Си, для копирования нуль терминированной строки (включая нуль терминатор) в заданный буфер . Содержание 1 Прототип функции 2 Возвращаемое значение … Википедия

WinMain — функция, в которой программист пишет основной код, который будет выполнять программа под Windows для подсистемы GUI. Эта функция вызывается из функции WinMainCRTStartup (находящейся в CRT), которая по умолчанию является точкой входа в программу… … Википедия

Объявление (информатика) — Возможно, эта статья содержит оригинальное исследование. Добавьте ссылки на источники, в противном случае она может быть выставлена на удаление. Дополнительные сведения могут быть на странице обсуждения. (25 мая 2011) … Википедия

Strcpy — функция стандартной библиотеки языка программирования Си, для копирования нуль терминированной строки в заданный буфер. Содержание 1 Прототип функции 2 Возвращаемое значение … Википедия

Экспериментальная модель — Прототип (от греч. protos первый и typos отпечаток, оттиск) прообраз, образец, оригинал. Прототип м. греч. первообраз, начальный, основной образец, истинник. Прототипный, типический, первообразный, первообразцовый (Словарь Даля). Прототип в… … Википедия

D (язык программирования) — У этого термина существуют и другие значения, см. D. D Семантика: мультипарадигменный: императивное, объектно ориентированное, обобщённое программирование Тип исполнения: компилятор Появился в: 1999 Автор(ы) … Википедия

Feof — feof  функция стандартной библиотеки языка Си, объявленная в заголовочном файле stdio.h. Ее основное назначение  отличать случаи, когда операции потока достигают конца файла, от случаев, когда возвращается код ошибки EOF («конец файла» … Википедия

DLL — (англ. Dynamic link library  динамически подключаемая библиотека)  понятие операционных систем Microsoft Windows и IBM OS/2; динамическая библиотека, позволяющая многократное применение различными программными приложениями. K DLL… … Википедия

Прототипы и наследование в JavaScript

Александр Мальцев

В этой статье мы изучим всё что касается прототипов в JavaScript. Разберём зачем они нужны, что такое наследование и цепочка прототипов, как работает this внутри методов, рассмотрим пример расширения классов и многое другое.

Что такое прототипы?

При создании объектов, например, с помощью конструктора, каждый из них будет содержать специальное внутреннее свойство [[Prototype]] , указывающее на его прототип . В JavaScript прототипы используются для организации наследования .

Допустим у нас имеется конструктор Box :

При объявлении конструктора или класса у него автоматически появится свойство prototype . Оно содержит прототип . Прототип – это объект. В данном случае им будет являться Box.prototype . Это очень важный момент.

Этот прототип будет автоматически назначаться всем объектам , которые будут создаваться с помощью этого конструктора:

Таким образом при создании объекта, в данном случае, box1 , он автоматически будет иметь ссылку на прототип, то есть на свойство Box.prototype .

Это очень легко проверить:

Прототип объекта в JavaScript

Получить прототип объекта в JavaScript можно с помощью статического метода Object.getPrototypeOf или специального свойства __proto__ . В этом примере показаны два этих способа. Кстати, свойство __proto__ не является стандартным, но оно поддерживается всеми браузерами.

Свойство prototype имеется у каждой функции за исключением стрелочных. Это свойство как мы уже отмечали выше в качестве значения имеет объект. По умолчанию в нём находится только одно свойство constructor , которое содержит ссылку на саму эту функцию:

То есть Box.prototype.constructor – это сам конструктор Box .

Если создать ещё один объект класса Box , то он тоже будет иметь точно такой же прототип. Как мы уже отмечали выше прототипы в JavaScript используются для организации наследования. То есть, если мы сейчас в Box.prototype добавим какой-нибудь, например, метод, то он будет доступен для всех экземпляров класса Box :

Прототип объекта на уровне родительского класса в JavaScript

Обратите внимание, что метода print нет у объектов box1 и box2 . Но если раскрыть значение свойства [[Prototype]] в консоли в веб-браузере, то вы увидите его. То есть этот метод находится на уровне класса Box и наследуется всеми его экземплярами.

Соответственно получается, что мы можем вызвать print как метод объектов box1 и box2 . Таким образом нам доступны не только собственные свойства и методы, но также наследуемые. А наследование как вы уже понимаете осуществляется в JavaScript на основе прототипов.

Так что же такое прототип? Прототип в JavaScript – это просто ссылка на объект, который используется для наследования .

Наследование

Что такое наследование? Если после переменной, содержащей некоторый объект поставить точку, то вы увидите все доступные для него свойства и методы:

Список доступных свойств и методов на уровне объекта box1

Здесь width и height – это его собственные свойства. Далее на уровне родительского класса находятся методы constructor и print . Т.е. вы можете вызвать метод print , потому что он наследуется всеми экземплярами класса Box . Кроме этого, здесь имеются методы класса Object , такие как hasOwnProperty , isPrototypeOf , toString и так далее. Эти методы тоже доступны, потому что Box.prototype наследует все свойства и методы Object.prototype .

Таким образом, кроме собственных свойств и методов объекту также доступны свойства и методы из прототипов. Такие свойства и методы называются наследованными .

Следовательно, в этом примере объект box1 имеет свои собственные свойства width и height , а также наследует все свойства и методы Box.prototype и Object.prototype .

Цепочка прототипов

В JavaScript наследование осуществляется только на уровне объектов через прототипы. То есть один объект имеет ссылку на другой через специальное внутреннее свойство [[Prototype]] . Тот в свою очередь тоже имеет ссылку и т.д. В результате получается цепочка прототипов.

Таким образом наследование, которые мы рассмотрели выше на примере объекта box1 происходит благодаря существованию следующей цепочки прототипов:

Заканчивается цепочка на прототипе глобального класса Object , потому что он не имеет прототипа, то есть его значение __proto__ равно null .

При этом, когда мы пытаемся получить доступ к некоторому свойству или методу этого объекта, поиск всегда начинается с самого объекта. Если данного свойства или метода у него нет, то поиск перемещается в прототип, потом в прототип прототипа и так далее.

Если указанное свойство или метод не найден, то возвращается undefined .

Например, если метод print мы добавим в сам объект box1 , то будет использоваться уже он, а не тот, который находится в прототипе Box.prototype :

Почему? Потому что поиск сразу прекращается, как только указанный метод будет найден. А в данном случае он будет найден сразу в объекте, поэтому переход в прототип не осуществится.

Значение this внутри методов

Значение this внутри методов определяется только тем для какого объекта мы его вызываем.

Рассмотрим следующий пример:

Здесь мы вызываем up как метод объектов counter1 и counter2 . Данный метод не является собственным для этих объектов, он наследуется и находится на уровне класса Counter . Но на самом деле это не имеет значения. Единственное что важно для this – это только то, для какого объекта мы вызываем этот метод, то есть что стоит перед точкой. Это и будет this .

При вызове counter1.up() , this внутри этого метода будет указывать на counter1 :

На строчке перед точкой стоит counter2 , значит this внутри up будет указывать на него :

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

Установка прототипа объекту

Установить прототип объекту можно с помощью статического метода Object.setPrototypeOf() или свойства __proto__ .

Например, создадим два объекта и установим для второго объекта в качестве прототипа первый объект с помощью __proto__ :

Проверить что прототипом для person2 является person1 очень просто:

Установка объекта прототипа с помощью специального свойства __proto__

При этом метод printName становится наследуемым, то есть доступным для объекта person2 :

Пример установки прототипа с помощью Object.setPrototypeOf() :

Установка объекта прототипа с помощью Object.setPrototypeOf()

В этом примере мы в качестве прототипа для errorMessage установили message .

Чтобы было более понятно как работает метод Object.setPrototypeOf , рассмотрим его синтаксис:

  • obj – объект, для которого необходимо установить прототип;
  • prototype – объект, который будет использоваться в качестве прототипа для obj , или null , если у obj не должно быть прототипа.

Очень важный момент заключается в том, что мы не можем указать в качестве прототипа объект, который уже имеется в цепочке, то есть замкнуть её.

Следовательно, мы получим ошибку, если попытаемся для message установить в качестве прототипа errorMessage :

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

Наследование классов

Допустим у нас имеется конструктор Person :

Создадим конструктор Student , который будет расширять класс Person :

Но на данном этапе, они сейчас полностью независимы. Но для того чтобы класс Student расширял Person нужно указать, что прототипом для Student.prototype является Person.prototype . Например, выполним это с помощью свойства __proto__ :

Создадим новый экземпляр класса Student :

Для этого объекта будет доступен как метод getSchoolName , так и getName .

Рассмотрим ещё один очень интересный пример с наследованием классов:

Здесь у нас имеются 3 класса: Rectangle , Square и Circle . Для того чтобы объекты класса Square наследовали свойства и методы Rectangle.prototype мы прописали следующую связь:

Похожим образом мы это сделали также для объектов класса Circle :

Таким образом, объекты, являющиеся экземплярами класса Circle наследуют свойства и методы Circle.prototype , Square.prototype , Rectangle.prototype и Object.prototype . Это происходит благодаря следующей цепочки прототипов:

Для вызова в Square родительского конструктора мы используем метод call . С помощью call мы задаём контекст, в котором нам нужно вызвать функцию. В данном случае мы вызываем Rectangle в контексте текущего создаваемого объекта.

Свойство constructor

У каждой функции, кроме стрелочных, как уже отмечали выше по умолчанию, имеется свойство prototype . Как мы уже отмечали выше это прототип, который автоматически будут иметь все объекты, если мы эту функцию будет использовать как конструктор, то есть для создания объектов.

По умолчанию свойство prototype функции содержит следующий объект:

Здесь мы свойству prototype присвоили объект вручную, но точно такой же генерируется автоматически. Этот объект изначально содержит только свойство constructor , которое указывает на сам конструктор, то есть на функцию.

Свойство constructor можно использовать для создания объектов:

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

Не рекомендуется полностью перезаписывать значение свойства prototype , потому что в этом случае вы потеряете constructor и его придётся добавлять вручную:

Если нужно что-то добавить в prototype , то делайте это как в примерах выше, то есть посредством простого добавления ему нужных свойств и методов:

Встроенные прототипы

В JavaScript практически всё является объектами. То есть функции, массивы, даты и так далее. Исключением являются только примитивные типы данных: строка, число и так далее.

Например, при создании объекта { name: ‘Tom’ } внутренне используется конструктор Object :

Прототипом такого объекта соответственно становится Object.prototype и в этом легко убедиться:

Поэтому нам на уровне этого объекта доступны различные методы, они берутся из Object.prototype . Например, метод hasOwnProperty :

Этот метод возвращает true , когда указанное свойство является для этого объекта родным. В противном случае – false .

При этом Object.prototype является корнем иерархии других встроенных прототипов. Но при этом он сам не имеет прототипа.

JavaScript - Object.prototype

На рисунке видно, что конструктор Object имеет по умолчанию свойство prototype . Это значение будет автоматически записываться в свойство [[Prototype]] объектов, которые будет создаваться с помощью этого конструктора. В Object.prototype имеется свойство constructor , которые указывает на сам конструктор. Эти связи между Object и Object.prototype показаны на схеме. Кроме этого Object.prototype не имеет прототипа. То есть его значение [[Prototype]] содержит null .

Теперь давайте рассмотрим, как выполняется создание даты в JavaScript . Осуществляется это очень просто посредством конструктора Date :

Методы прототипа конструктора Date

Следовательно, прототипом даты является Date.prototype :

Этот прототип содержит большое количество методов для работы с датой, например, такие как getDate , getHours и так далее. Их нет в now , но они доступны нам посредством наследования.

Объект Date.prototype имеет в качестве прототипа Object.prototype :

Следовательно, методы Object.prototype , которых нет в Date.prototype также доступны для now . Например, hasOwnProperty :

Таким образом можно нарисовать следующую схему:

JavaScript - Date.prototype

Другие встроенные объекты устроены подобным образом.

Метод Object.create

Object.create предназначен для создания нового объекта, который будет иметь в качестве прототипа объект, переданный в этот метод в качестве аргумента:

Создание объекта с прототипом Object.prototype :

Данный пример аналогичен этому:

Создание объекта без прототипа:

Во 2 аргументе мы можем объекту сразу передать необходимые свойства. Описываются они в полном формате с использованием специальных атрибутов как в Object.defineProperties :

Здесь мы описали два свойства: name и age . С помощью value мы устанавливаем значение свойству, а посредством аргумента writable задаем доступно ли свойство для изменения.

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

В различных примерах программ мы обращали ваше внимание на повторяющийся код, который значительно увеличивал объем этих программ. Для оптимизации программного кода, чтобы сделать его более понятным и удобным для восприятия, используются подпрограммы. Подпрограмма (англ. subroutine) позволяет вынести часть реализации (некоторую вполне самостоятельную подзадачу или алгоритм) за пределы основной программы и обращаться к ней, по мере необходимости, по имени, из любой части программы. Таким образом, можно не только сократить программный код, но и сделать его более структурированным.
Существует две разновидности подпрограмм: процедуры и функции. Но это деление чисто условное. В C++ между функциями и процедурами нет больших синтаксических различий, поэтому они имеют общее наименование – функции. Функция может принимать аргументы (не обязательно) и возвращать некоторое значение, возможно пустое ( void ). Если функция не возвращает никакого значения, то такая функция называется процедурой. В отличие от процедур, функции всегда возвращают результат в точку вызова.
Для того, чтобы использовать функцию в программе её нужно объявить, определить и вызвать по имени.

Объявление функции. Прототип

Объявление (англ. – declaration) функции должно следовать непосредственно за директивами #include . Такое объявление функции называется прототипом. Прототип необязателен, если в этом месте программы функция не объявляется, а определяется (англ. – definition), т. е. полностью описывается её алгоритм. Но в сложных программах, в которых используется множество функций, такой подход может усложнить восприятие программного кода. Поэтому общепринятой практикой является прототипирование в начале файла исходного кода (до функции main ), а её описание – в конце.
Прототип состоит из указания типа возвращаемого значения, имени функции и () в которых указываются (через запятую) типы параметров. В случае, если функции не передаются аргументы, список параметров оставляется пустым или содержит ключевое слово void . Заканчивается строка объявления – «;» .
Задача 1. Рассмотрим использование функции на примере программы, которая должна вывести на экран несколько линий из символов ‘#’ . Длина линий и их количество определяется в процессе работы программы.
Функция line() не возвращает значение, но имеет два целочисленных параметра: количество линий и их символьная длина. Тогда прототип этой функции записывается так:

Определение функции

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

Если функция не имеет параметров (т. е. данные в функцию не принимаются из-вне), то круглые скобки остаются пустыми.
Тело функции содержит реализацию алгоритма подпрограммы, которая подчиняется общим синтаксическим правилам языка. Например, можно определять переменные фундаментальных и абстрактных типов, осуществлять вызовы библиотечных функций, обращаться к глобальным объектам, которые определены или объявлены вне данной функции, создавать локальные функции и использовать при составлении алгоритма любые операции и инструкции языка. Локальные объекты, которые определены в блоке функции, вне её – не видны.
Составим определение функции line() . Параметры этой функции – x и y , целочисленные переменные, с помощью которых устанавливаются длина линий и их количество. Чтобы в программе не было путаницы с именами, принято (но не запрещено!) чтобы имена параметров и других переменных функции не совпадали с именами переменных в основной программе или именами глобальных объектов.
Определение нашей функции может быть составлено следующим образом:

Вызов функции

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

Процедуры

Тип функции описанной в программе 9.2.1 – это процедура. Процедура производит определенные действия в программе, но не возвращает никакого значения. Вызов процедуры можно включать в программу отдельной инструкцией в основной программе, в ветвях условной инструкции, в теле цикла, а также в других функциях.
В программе 9.1.11, которую мы написали на предыдущем уроке, содержался многократно повторяющийся код рисования треугольника:

Создадим на основе данного кода процедуру рисования равностороннего треугольника и заливку его определенным цветом. Тогда программу 9.1.11 можно переписать следующим образом:

Наша программа сократилась на 14 строк! Обратите внимание, что аргументами функции могут быть не только переменные, но и константы. Так, в этой программе, значение цвета передается строковым литералом.

Инструкция return

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

или возвращение значения функции при вызове другой функции (т. е. использование функции в качестве аргумента):

Чтобы функция смогла возвращать какое-либо значение, полученное в процессе её работы, используется инструкция return . Эта инструкция завершает работу функции и возвращает её значение выражением, которое следует за ключевым словом return . В теле функции должна быть только одна такая инструкция. Допускается использование нескольких инструкций return , но только в том случае, если они находятся в ветвях условной инструкции.
Помимо наличия инструкции return , функцию от процедуры отличает ещё и то, что перед именем в прототипе и в заголовке функции вместо void указан спецификатор типа возвращаемого значения. Тип возвращаемого значения может быть любым, в том числе абстрактным.
Задача 2. Составить программу вычисляющую среднее арифметическое и среднее геометрическое двух введенных чисел a и b . Вычисление среднего арифметического и среднего геометрического оформить в виде функций.

Рассмотрим пример, когда функция возвращает логическое значение (логическая функция). Используем ранее составленную программу (8.9.9) для решения следующей задачи с помощью функции (а за одно и ускорим её работу).
Задача 3. Составить программу определяющую является ли число простым. Тест на простоту оформить в виде функции.

Вынос различных подзадач в функции значительно упрощает чтение и обзор основной программы. Покажем это на следующей задаче.
Задача 4. Составить программу подсчета всех шестизначных счастливых «чисел». Число называется «счастливым», если сумма его первых трех разрядов равна сумме трех его младших разрядов.

Локальные и глобальные переменные. Передача аргументов

Ранее мы упоминали, что блок функции определяет область видимости данных. Что это значит? Приведем пример:

Параметр a функции fun является локальной переменной — её видимость определяется блоком функции. Поэтому вызов функции fun изменяет значение локальной перемененной a , но не изменяет глобальный объект a . Если имена глобального и локального объекта совпадают, то видимость в функции глобального объекта «отключается».
Параметры функций (во всех программах выше) инициализируются также, как и обычные переменные, при этом значение аргумента копируется. Такой способ передачи аргументов называется передачей аргумента по значению. При таком способе передачи аргументов в функцию невозможно изменить значения объектов в основной программе (глобальных объектов).
Задача 5. Рассмотрим пример функции Swap() , которая обменивает значения двух объектов программы.

После запуска программы мы увидим, что глобальные переменные не изменили своего значения. Для того, чтобы появилась возможность изменять значения объектов в основной программе, необходимо связать параметры функции с глобальными объектами. Для этих целей применяются ссылки. Такой способ передачи аргументов называется передача аргументов по ссылке. Для передачи по ссылке используется операция & . Внесем изменения в прототип:

и в заголовок функции:

Сохраним и запустим программу на выполнение ещё раз. Переменные поменяют своё значение.
Вывод

Обратите внимание на использование инструкции return в процедуре. Здесь (программа 9.2.7 стр. 19) эта инструкция применялась для завершения и выхода из функции (в случае равенства двух значений), а не для возвращения какого-либо значения.

Что такое прототип процедуры

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

Во время выполнения программы, описания данных сохраняют за собой области памяти которые управляются в соответствии c выполнимыми операторами. Любой оператор кода или описание данных может быть идентифицировано меткой. Метка описывает определенное местоположение в PRO RAM (памяти процессора?). Ко всем переменным, структурам данных, PROCEDUREМ, FUNCTIONМ, ПОДПРОГРАММАМ можно обращаться по их меткам.

В исходных модулях Кларион, 1ый столбец отведен для меток. Метка может содержать буквы (на верхнем или нижнем регистрах), цифры от 0 до 9, символ подчеркивания символ (_), и двоеточие (:). Первый символ должен быть буквой или символом подчеркивания. Метки не чувствительны к регистру букв, поэтому, CurRent и CURRENT одинаковые метки. Метка не может быть зарезервированным словом. Любое выполнимый оператор может иметь метку которая может использоваться как цель для оператора GOTO.

Метка оператора PROCEDURE или FUNCTION — название(имя) функции или процедуры. Использование метки ПРОЦЕДУРЫ в выполнимом операторе выполняет процедуру. Метка ФУНКЦИИ используется в выражениях, или списках параметров других функций, для присвоения значения, возвращаемого функцией.

Завершение структуры

Составные структуры данных создаются, когда описания данных вложены в другие описания данных. Имеются множество составных структур данных в языке Кларион: SCREEN, REPORT, FILE, RECORD, GROUP, и т.д. Эти составные структуры данных должны завершать с точкой (.) или ключевым словом END. Операторы IF, CASE, EXECUTE, LOOP, и BEGIN, все формы управляющих структур должны также быть завершены точкой или оператором END.

Зарезервированные слова

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

AND ELSE LOOP RETURN
BEGIN ELSIF MEMBER ROUTINE
BREAK END NOT SECTION
BY EXECUTE OF TDEN
CASE EXIT OMIT TIMES
COMPILE FUNCTION OR TO
CYCLE GOTO OROF UNTIL
DO IF PROCEDURE WHILE
EJECT INCLUDE PROGRAM XOR

Следующие ключевые слова могут использоваться как метки структур данных или выполнимых операторов. Они не могут использоваться как метки операторов PROCEDURE or FUNCTION:

CODE FOOTER MENU QUEUE ROW
COL GROUP MODULE RECORD SCREEN
DETAIL HEADER OPTION REPEAT SUBTITLE
FILE MAP PULLDOWN REPORT TITLE
Специальные символы

Это список специальных символов используемых в языке Кларион:

Глобальные, локальные, статические, и динамические данные

Термины Глобальные и Локальные относятся к доступности данных. Глобальные данные доступны всюду в программе, Локальные данные имеют ограниченную доступность. Статические и Динамические относятся к распределению памяти для данных. Память для Статических данных выделяется при загрузке программы, для динамических данных выделяется во время исполнения.

Имеются три типа данных которые могут быть определены в программе на Кларион: Глобальные Статические данные, Локальные Статические данные, и Локальные Динамические данные.

Глобальные Статические данные объявлен в секции данных ПРОГРАММЫ, между ключевыми словами PROGRAM и CODE. Они доступны выполнимым операторам и выражениям в каждой ПРОЦЕДУРЕ и ФУНКЦИИ ПРОГРАММЫ. Они всегда в памяти во время исполнения программы.

Локальные Статические данные объявлены в модуле-ЧЛЕНЕ, между ключевыми словами MEMBER и PROCEDURE (или FUNCTION). Доступность этих данных ограничена переделами модуля-ЧЛЕНА в котором они объявлены; к ним могут обращаться только ПРОЦЕДУРЫ и ФУНКЦИИИ в модуле-ЧЛЕНЕ. Однако, они могут быть переданы как параметр любой другой ПРОЦЕДУРЕ или ФУНКЦИИ. Локальные Статические данные всегда в памяти во время выполнения программы.

Локальные Динамические данные объявлены в секции данных ПРОЦЕДУРЫ или ФУНКЦИИ, между ключевыми словами PROCEDURE (или FUNCTION) и CODE. Доступны только в ПРОЦЕДУРЕ или ФУНКЦИИИ в которой они объявлены; на них может ссылаться только эта ПРОЦЕДУРА или ФУНКЦИЯ. Однако, они могут быть переданы как параметр любой другой ПРОЦЕДУРЕ или ФУНКЦИИ. Память используемая локальными данными динамически размещается в стеке при вызове PROCEDURE или FUNCTION, и освобождается когда PROCEDURE или FUNCTION закончена.

Cтруктурам данных SCREEN, PULLDOWN, FILE, QUEUE, и REPORT назначается Статическая память, объявлены они Глобальными, Локальными в модуле-ЧЛЕНЕ, или локальными в ПРОЦЕДУРЕ или ФУНКЦИИ. Только описания переменных локальные в ПРОЦЕДУРЕ или ФУНКЦИИ размещены на стеке. Это позволяет ФУНКЦИИ или ПРОЦЕДУРЕ быть истинно рекурсивной, получая новую копию Локальных переменных при каждом ее вызове, при использовании только одной копии любой структуры.

ФОРМАТ ПРОГРАММЫ
PROGRAM (Объявить программу)
MAP Описание глобальных процедур и функций.
прототипы Объявления PROCEDURE или FUNCTION.
глобальные данные Объявление Глобальных Статических данных, которые могут использоваться всеми процедурами и функциями.
CODE Начало блока выполнимых операторов.
операторы Выполнимые инструкции программы.
RETURN Завершает выполнение программы. Возвращает управление операционной системе.
Процедуры или Функции Исходный текст для процедур и функций в Модуле PROGRAM.

Оператор PROGRAM — первое описание в исходном модуле Кларион- программы.

Ему могут предшествовать либо комментарии к исходному тексту, либо директивы компилятора TITLE & SUBTITLE. Имя файла исходного текста ПРОГРАММЫ используется как имя файла для объектного (.OBJ) и исполняемого (.EXE) модулей при компиляции. Оператор PROGRAM может иметь метку, но метка игнорируется компилятором.

ПРОГРАММА с PROCEDURE и-или FUNCTION должна иметь MAP-структуру. MAP объявляет прототипы функций и-или процедур. Любая PROCEDURE или FUNCTION содержащаяся в отдельном файле исходного текста должна быть объявлена в структуре MODULE в пределах MAP.

Данные объявленные в модуле PROGRAM, между PROGRAM и CODE, является "Глобальными Статическими данными" и доступны из любой ПРОЦЕДУРЫ или ФУНКЦИИ в ПРОГРАММЕ.

MEMBER (Идентифицирует принадлежность модуля-члена)
Программа Строковая константа, содержащая имя файла (без расширения) модуль PROGRAM. Этот параметр требуется.
MAP Описание локальных процедур и функций. Любые процедуры или функции объявленные здесь могут быть использованы только теми процедурами или функциями, чей код находится в этом модуле-ЧЛЕНЕ.
прототипы Объявления PROCEDURE или FUNCTION.
локальные данные Объявление локальных Статических данных, которые могут использоваться только теми процедура- ми и функциями чей исходный код находится в этом модуле-ЧЛЕНЕ.
CODE Начало блока выполнимых операторов.
операторы Выполнимые инструкции программы.
RETURN Завершает выполнение программы. Возвращает уп равление операционной системе.
Процедуры или Функции Исходный текст для процедур и функций в модуля-ЧЛЕНА.

MEMBER — первый оператор в исходном модуле, который не является PROGRAM-модулем. Ему могут предшествовать только комментарии к исходному тексту и-или директивы компилятора или TITLE и SUBTITLE. Это слово требуется в начале любого исходного файла который содержит процедуры и-или ФУНКЦИИ которые используются в ПРОГРАММЕ. Оператор MEMBER идентифицирует программу к которой принадлежит данный исходный МОДУЛЬ.

Модуль-ЧЛЕНА может иметь собственную MAP-структуру. Процедуры и функции, объявленные в этой MAP, доступны только другим процедурам и функциям в этом модуле-ЧЛЕНЕ. Исходный код для процедур и функций, объявленных в MAP этого модуля-ЧЛЕНА, может содержаться в файле самого модуля-ЧЛЕНА, или другом файле. Если исходный код для ПРОЦЕДУРЫ или ФУНКЦИИ объявленной в MAP модуля-ЧЛЕНА содержится в отдельном файле, прототип такой процедуры и-или функции должен быть объявлен в структуре MODULE в пределах MAP данного модуля-ЧЛЕНА. Этот отдельный исходный файл модуля-ЧЛЕНА должен также содержать собственную MAP, которая объявляет тот же самый прототип для этой ПРОЦЕДУРЫ или ФУНКЦИИ. Любая PROCEDURE или FUNCTION не объявленная в Глобальной MAP (ПРОГРАММЫ) должна быть объявлена в локальной MAP в МОДУЛЕ-ЧЛЕНЕ который содержит исходный код.

Данные объявленные в модуле-ЧЛЕНЕ, между ключевыми словами MEMBER и PROCEDURE или FUNCTION, является "Локальными Статическими данными" и к ним могут обращаться только PROCEDURE или FUNCTION в пределах модуля.

MAP (Обьявить прототипы ПРОЦЕДУР и-или ФУНКЦИЙ)
MODULE Объявление исходного модуля-члена.

MAP-структура содержит прототипы, которые описывают функции, процедуры и внешние исходные модули используемые в ПРОГРАММЕ или модуле-ЧЛЕНЕ. MAP объявленная в PROGRAM-модуле объявляет ПРОЦЕДУРЫ или ФУНКЦИИ которые доступны повсюду в программное. MAP в модуле-ЧЛЕНЕ объявляет ПРОЦЕДУРЫ или ФУНКЦИИ которые доступны только в этом модуле-ЧЛЕНЕ.

МОДУЛЬ (указывает файл с модулем-ЧЛЕНОМ)
sourcefile Строковая константа. Если sourcefile содержит исходный код на Кларион, то задается имя файла (без расширения) который содержит ПРОЦЕДУРЫ и-или ФУНКЦИИ. Если sourcefile внешняя библиотека, то строка может содержать любой уникальный идентификатор.
прототип Процедуры прототип ПРОЦЕДУРЫ содержащейся в sourcefile.
прототип Функции прототип ФУНКЦИИ содержащейся в sourcefile.

Структура MODULE именует модуль-ЧЛЕН. Он содержит прототипы дл ПРОЦЕДУР и ФУНКЦИЙ содержащихся в sourcefile. Структура MODULE может только быть объявлена в пределах MAP-структуры.

Прототипы ПРОЦЕДУР и ФУHКЦИЙ
Имя Метка оператора PROCEDURE или FUNCTION.
Список параметров типы данных переданных ПРОЦЕДУРЕ или ФУНКЦИИ в качестве параметров
возвращаемый тип Тип данных, который возвращает FUNCTION.
Соглашения Вызова Задает паскалевский или С-подобный вид передачи параметров через стек.
RAW Указывет, что параметры STRING или GROUP передают только адрес в памяти.
NAME Определяет замену, "внешнее" имя для ПРОЦЕДУРЫ или ФУНКЦИИ.

Все ПРОЦЕДУРЫ и ФУНКЦИИ в ПРОГРАММЕ должны быть объявлены как прототипы в MAP. Прототип состоит из: имени ПРОЦЕДУРЫ или ФУНКЦИИ, необязательного списка параметров, и возвращаемого типа данных (если описывается FUNCTION). Если PROCEDURE или FUNCTION библиотека, написанная на другом языке, C или ПАСКАЛЕ, может быть указано соглашение о вызове (передаче параметров через стек. Также может быть определено внешнее (external) ИМЯ.

Необязательный список параметров — список типов данных которые передаются ПРОЦЕДУРЕ или ФУНКЦИИ, разделяются запятыми и заключается в круглые скобками. Любой параметр который может быть опущен при вызове PROCEDURE или FUNCTION, должен быть в список параметров прототипа и заключаться в угловые скобки ( ). Есть три типа параметров которые могут быть пропущены: параметры-значения, параметры-переменные, и параметры-указатели (?).

Параметры-значенияи "передаются по значению." В "вызванной" ПРОЦЕДУРЕ или ФУНКЦИИ используется копия переменной переданной в списке параметров "вызывающей" ПРОЦЕДУРЫ или ФУНКЦИИ. "Вызванная" PROCEDURE или FUNCTION не может изменить значение переменной переданной ей "вызывающей". Параметры-значения представлены в списке типом данных в прототипе ПРОЦЕДУРЫ или ФУНКЦИИ в MAP. Допустимые типы параметров-значений:

Параметры-переменные "передаются по адресу". Переменная переданная по адресу имеет только один адрес в памяти. Изменение значения переменной в "вызванной" ПРОЦЕДУРЕ или ФУНКЦИИ изменяет значение самой переменной, а не ее копии. Параметры-переменные представлены в списке типами данных со звездочкой (*) в прототипе ПРОЦЕДУРЫ или ФУНКЦИИ в MAP. Допустимые типы параметров-переменных:

Параметры-указатели передают имя структуры данных "вызванной" ПРОЦЕДУРЕ или ФУНКЦИИ. Передача указателя позволяет "вызванной" ПРОЦЕДУРЕ или ФУНКЦИИ использовать те команды Кларион, которые требуют метку структуры как параметр. Параметры-указатели представлены в списке типом указатель в прототипе ПРОЦЕДУРЫ или ФУНКЦИИ в MAP. Параметры-указатели всегда "передаются по адресу." Допустимые типы параметров-указателей:

FUNCTION должна ВОЗВРАЩАТЬ (RETURN) значение. Тип данных который нужно возвратить внесен в список, отделяется запятой, после необязательного списка параметров. Допустимые типы результатов, возвращаемых функцией:

Вы можете, но не обязаны, указать способ передачи параметров — C или ПАСКАЛЬ для вашей ПРОЦЕДУРЫ или ФУНКЦИИ. Это обеспечивает совместимость библиотеками написанными на других языках. Если вы не указываете тип соглашения о вызове, по умолчанию используется внутреннее, основанное на регистрах соглашение.

Признак RAW позволяет вам передавать только адрес памяти СТРОКИ или ГРУППЫ, либо как параметр-значение, либо как параметр-переменную. Обычно, параметры STRING или GROUP передают адресату(?) еще и длину строки. Признак RAW подавляет передачу длины. Это наиболее полезно для функций внешних библиотек, которые ожидают получить только адрес строки.

Признак NAME обеспечивает внешнее имя для ПРОЦЕДУРЫ или ФУНКЦИИ. Это также сделано для совместимости с библиотеками написанными на других языках. Например: В некоторых компиляторах языка C, при C-шном соглашении о вызове заданном для функции, компилятор добавляет подчеркивание к имени функции. Признак NAME позволяет линкеру разрешить нормальное имя функции не заставляя программу на Кларион обращаться к функции с именем, начинающимся с подчеркивания.

PROCEDURE (Объявить процедуру)
Список параметров Необязательный список переменных, которые передают значения ПРОЦЕДУРЕ. Этот список определяет имя каждого параметра используемого в пределах ИСХОДНОГО кода процедуры. Каждый параметр отделяется запятой. Тип данных каждого параметра указан в прототипе процедуры в MAP- структуре.
Локальные данные Объявите Локальные Динамические данные, которые могут использоваться только в этой процедуре.
CODE Начало выполнимых операторов.
операторы Выполнимые инструкции программы.
RETURN Завершить выполнение процедуры. Вернуться в точку, из которой процедура была вызвана.

Декларация ПРОЦЕДУРЫ начинает секцию исходного кода который может быть выполнен в ПРОГРАММЕ. Процедура вызывается обращением к ее метке (и указанием параметров, если есть в наличии) как к исполняемому оператору в секции кода ПРОГРАММЫ, ПРОЦЕДУРЫ, или ФУHКЦИИ. ПРОЦЕДУРА завершается и возвращается в точку вызова когда выполнен оператор RETURN. Неявное RETURN происходит в конце выполнимого кода. Конец выполнимого кода для ПРОЦЕДУРЫ определен как конец исходного файла или начала новой ФУНКЦИИ, ROUTINE, или другой ПРОЦЕДУРЫ.

Данные объявленные в пределах ПРОЦЕДУРЫ, между ключевыми словами PROCEDURE и CODE, являются "Локальными Динамическими данными" к которым может обращаться только данная ПРОЦЕДУРА (если они не переданы как параметр другой ПРОЦЕДУРЕ или ФУНКЦИИ). Эти данные кладутся на стек, память под них выделяется при входе в процедуру, и освобождается при ее завершении.

ПРОЦЕДУРА должна быть объявлена в MAP модуля-ЧЛЕHА или ПРОГРАММЫ. Если она объявлена в MAP ПРОГРАММЫ, то она доступна любой другой процедуре или функции в программе. Если же объявлена в MAP модуля-ЧЛЕHА, то процедура доступна только другим процедурам или функциям из этого модуля-ЧЛЕHА.

FUNCTION (Объявить функцию)
Список параметров Необязательный список переменных которые передают значения ФУНКЦИИ. Этот список определяет имя каждого параметра используемого в пределах исходного кода ФУHКЦИИ. Каждый параметр отделяется запятой. Тип данных каждого параметра задается в прототипе функции в MAP-структуре.
Локальные данные Объявляет Локальные Динамические данные которые могут использоваться только этой функцией.
CODE Начало выполнимых операторов.
операторы Выполнимые инструкции программы.
RETURN Завершает выполнение функции и возвращает значение в выражение в котором функция использовалась.
Значение Числовая или строковая постоянная или переменная которая определяет результат вызова функции.

Декларация ФУНКЦИИ начинает секцию исходного кода который может быть выполнен обращением к метке ФУНКЦИИ (со списком параметров, если есть). Функция может использоваться как компонент выражения, или параметр ПРОЦЕДУРЫ или другой ФУНКЦИИ в секции кода ПРОГРАММЫ. Выполнение ФУНКЦИИ завершается (требуемым) оператором RETURN в ее секции CODE.

Данные объявленные в пределах ФУНКЦИИ, между ключевыми словами FUNCTION и CODE, являются "Локальными Динамическими данными" к которым может обращаться только данная ФУНКЦИЯ (если они не переданы как параметр другой ПРОЦЕДУРЕ или ФУНКЦИИ). Эти данные кладутся на стек, память под них выделяется при входе в функцию, и освобождается при выходе из нее.

ФУНКЦИЯ должна быть объявлена в MAP модуля-ЧЛЕHА или ПРОГРАММЫ. Если она объявлена в MAP ПРОГРАММЫ, то она доступна любой другой процедуре или функции в программе. Если же объявлена в MAP модуля-ЧЛЕHА, то функция доступна только другим процедурам или функциям из этого модуля-ЧЛЕHА.

CODE (Начать выполнимые операторы)

Оператор CODE отделяет секцию декларации данных от секции выполнимых операторов в пределах ПРОГРАММЫ, ПРОЦЕДУРЫ, или ФУНКЦИИ. Первый оператор, который выполнится в ПРОГРАММЕ, ПРОЦЕДУРЕ или ФУНКЦИИ — оператор после слова CODE.

ROUTINE (Обьявить локальную подпрограмму)

ROUTINE объявляет начало местной подпрограммы. Она локальна по отношению к ПРОЦЕДУРЕ или ФУНКЦИИ в которой она описана и должна быть в конце секции CODE ПРОЦЕДУРЫ или ФУНКЦИИ к которой она принадлежит.

ROUTINE вызывается оператором DO, за которым идет метка подпрограммы. Управление Программе после выполнения ROUTINE возвращается оператору после слова DO. ROUTINE заканчивается концом исходного модуля, или началом другой ROUTINE, ПРОЦЕДУРЫ, или ФУНКЦИЙ. Оператор RETURN может также использоваться для завершения кода ROUTINE (подобно RETURN в ПРОЦЕДУРЕ).

END (Завершить структуру)

END завершает описание данных или составной выполнимый оператор. Функционально эквивалентен точке (.)

ДИРЕКТИВЫ КОМПИЛЯТОРА

Директивы Компилятора операторы которые говорят компилятору выполнить некоторое действие во время компиляции. Эти операторы не включены в выполнимый объектный код программы который производит компилятор.

BEGIN (Определить структуру кода)

Директива компилятора BEGIN заставляет компилятор рассматривать группу операторов как единую структуру. BEGIN структура должна завершаться точкой или оператором END.

BEGIN используется в структуре управления EXECUTE чтобы позволить обрабатывать несколько строк кода как одну.

COMPILE (Определить источник который нужно компилировать)

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

Сама строка-завершитель включается в COMPILE-блок.

Необязательный параметр "выражение" разрешает условный COMPILE. Форма выражения однозначна. Это — метка оператора EQUATE, либо установленный переключатель CONDITIONAL в Проектной Системе, сопровождаемый знаком равенства (=), за которым идет целая константа. Код между COMPILE и завершителем компилируется только если выражение истинно. Хотя выражение не требуется, COMPILE без параметра "выражение" не нужен, потому что весь исходный код компилируется, если явно не опущен с помощью OMIT. COMPILE и OMIT это, как говорят в Одессе, две большие разницы, и не могут быть вложены друг в друга.

EJECT (Начать новую страницу листинга)

Директива EJECT начинает новую страницу и, необязательно, новый подзаголовок модуля в листинге Кларион. Если подзаголовок модуль опущен, то для следующей страницы будет задействован подзаголовок установленный предыдущими директивами SUBTITLE или EJECT.

EMBED (Вложенная секция исходного кода)

Директива EMBED идентифицирует блок вложенного исходного кода. Блок начинается директивой EMBED и завершается оператором END или точкой.

Директива EMBED заставляет компилятор нумеровать строки исходного кода относительно начала вложенного кода. Строка используется в сообщениях об ошибках, чтобы определить какой именно вложенный код содержит ошибку. После завершающей точки или оператора END, нумерация строк компилятором продолжается с того места, где она была прервана директивой EMBED (включая число строк содержащихся во вложенном коде).

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

INCLUDE (Компилировать код из другого файла)

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

Компилятор использует файл Переназначений (TS.RED) чтобы найти требуемый файл. Файл ищется по маршруту, заданному для данного типа имени_файла (обычно по расширению). Это делает ненужным задание полного пути к имени_файла, который нужно включить. Обсуждение файла Переназначений находится в Руководстве программиста.

LIST (Помещает включенный исходный код в листинг компилятора)

Признак LIST директивы INCLUDE заставляет компилятор поместить включенный исходный код в листинг. Если признак LIST опущен, то только сам оператор INCLUDE появится в листинге.

OMIT (Указывает не подлежащий компиляции текст)

OMIT директива определяет блок исходных линий кода которые не надо компилировать. Эти строки могут содержать комментарии к исходному коду или секцию кода который был "отключен" для отладочных целей. Опущенный блок начинается с директивы OMIT и завершается строкой, которая содержит ту же самую строковую константу, что и завершитель. Сама строка-завершитель тоже входит в OMIT-блок.

Необязательный параметр "выражение" разрешает условный OMIT. Форма выражения однозначна. Это метка оператора EQUATE, либо установленный переключатель CONDITIONAL в Проектной Системе, сопровождаемый знаком равенства (=), за которым идет целая константа. Директива OMIT выполняется только, если выражение истинно.

COMPILE и OMIT — противоположны друг другу и не могут быть взаимно вложены.

SECTION (Определить секцию исходного кода)

Директива компилятора SECTION описывает начало блока выполнимого Директива компилятора SECTION описывает начало блока выполнимого исходного кода или описаний данных. SECTION используется как необязательный параметр директивы INCLUDE чтобы включить конкретный блок исходного кода. SECTION завершается следующей СЕКЦИЕЙ или концом файла.

См. Также: INCLUDE

SUBTITLE (Печатать подзаголовок МОДУЛЯ)

SUBTITLE печатает в первой колонке третьей строки листинга Кларион. Директива SUBTITLE не печатается в листинге. Директива SUBTITLE должна быть помещена в начале исходного модуля до описаний PROGRAM или MEMBER. Подзаголовок остается одним и тем же на каждой странице листинга, если его не измененит директива EJECT.

TITLE (Печатает заголовок МОДУЛЯ)

TITLE печатает в первой колонке первой строки листинга Кларион. Директива TITLE не печатается в листинге. Директива TITLE должна быть помещена в начале исходного модуля до описаний PROGRAM или MEMBER. Заголовок остается одним и тем же на каждой странице листинга.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *